使用twisted'的Python多处理;s反应堆
我在一个xmlrpc服务器上工作,它必须周期性地执行某些任务。我使用twisted作为xmlrpc服务的核心,但遇到了一个小问题:使用twisted'的Python多处理;s反应堆,python,twisted,multiprocessing,Python,Twisted,Multiprocessing,我在一个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 "
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
我应该如何连接这两个进程,以便它们各自的连接不会阻塞
(我对“join”很困惑。为什么它会被屏蔽,我在谷歌上搜索过,但找不到关于join用法的有用解释。有人能给我解释一下吗?)
关于您真的需要在单独的进程中运行Twisted吗?我觉得这很不寻常 试着把Twisted的反应堆当作你的主回路——并挂起你需要的所有东西——而不是把Twisted当作后台任务来运行 执行此类操作的更正常的方法是使用Twisted的.callLater或向Reactor添加LoopingCall对象 e、 g 嘿,多处理中的asdvawev-.join()与线程中的.join()一样,它是一个阻塞调用,主线程运行以等待辅助线程关闭。如果工作进程从未关闭,那么.join()将永远不会返回。例如:
class myproc(Process):
def run(self):
while True:
time.sleep(1)
在此基础上调用run意味着join()将永远不会返回。通常,为了防止出现这种情况,我将使用传递到子进程的Event()对象来通知子进程何时退出:
class myproc(Process):
def __init__(self, event):
self.event = event
Process.__init__(self)
def run(self):
while not self.event.is_set():
time.sleep(1)
或者,如果您的工作被封装在队列中,您只需让子进程离开队列,直到它遇到哨兵(通常是队列中的None条目),然后关闭
这两个建议都意味着,在调用.join()之前,您可以发送并设置事件,或者插入sentinel,当调用join()时,进程将完成当前任务,然后正确退出。oh man thx很多,这就是我需要的原因。你是在哪里发现LoopingCall的?这就是为什么我讨厌twisted——一方面,文档是不够的,而API是如此宏大,以至于你往往忽略了重要的部分。我知道你的意思——twisted可能很难学习,但一旦你有了这个想法,它就很好用了!O'Reilly这本书现在已经很老了,但它确实解释得很好,所以如果你想用Twisted做更多的事情,我建议你买一本。我建议订阅他们的邮件列表。如果你从古鲁那里读到了足够多的答案,那么其中一些问题就开始困扰大脑。
class myproc(Process):
def __init__(self, event):
self.event = event
Process.__init__(self)
def run(self):
while not self.event.is_set():
time.sleep(1)