使用twisted'的Python多处理;s反应堆

使用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 "

我在一个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
我应该如何连接这两个进程,以便它们各自的连接不会阻塞

(我对“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)