我正在开发一个xmlrpc服务器,它必须周期性地执行某些任务.我使用twisted作为xmlrpc服务的核心,但我遇到了一个小问题:
class cemeteryRPC(xmlrpc.XMLRPC): def __init__(self, dic): xmlrpc.XMLRPC.__init__(self) def xmlrpc_foo(self): return 1 def cycle(self): print "Hello" time.sleep(3) class cemeteryM( base ): def __init__(self, dic): # dic is for cemetery multiprocessing.Process.__init__(self) self.cemRPC = cemeteryRPC() def run(self): # Start reactor on a second process reactor.listenTCP( c.PORT_XMLRPC, server.Site( self.cemRPC ) ) p = multiprocessing.Process( target=reactor.run ) p.start() while not self.exit.is_set(): self.cemRPC.cycle() #p.join() if __name__ == "__main__": import errno test = cemeteryM() test.start() # trying new method notintr = False while not notintr: try: test.join() notintr = True except OSError, ose: if ose.errno != errno.EINTR: raise ose except KeyboardInterrupt: notintr = True
我应该如何加入这两个过程,以便它们各自的连接不会阻塞?
(我对"加入"非常困惑.为什么它会阻止我用谷歌搜索但是找不到很多有用的解释加入的用法.有人能解释一下吗?)
问候
你真的需要在一个单独的进程中运行Twisted吗?这看起来很不寻常.
试着把Twisted的Reactor想象成你的主循环 - 并挂掉你需要的一切 - 而不是试图将Twisted作为后台任务运行.
执行此类操作的更常规方法是使用Twisted的.callLater或将LoopingCall对象添加到Reactor.
例如
from twisted.web import xmlrpc, server from twisted.internet import task from twisted.internet import reactor class Example(xmlrpc.XMLRPC): def xmlrpc_add(self, a, b): return a + b def timer_event(self): print "one second" r = Example() m = task.LoopingCall(r.timer_event) m.start(1.0) reactor.listenTCP(7080, server.Site(r)) reactor.run()