English 中文(简体)
Python Python 反应器
原标题:Python multiprocessing with twisted s reactor
  • 时间:2009-09-04 06:08:57
  •  标签:

我正在开发一个Xmlrpc服务器,该服务器必须周期性地履行某些任务。 我是用tw子服务的核心,但我遇到了一个小问题:

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

如何加入这两个进程,以便它们各自加入这一进程?

(我被“就业”混为一谈。) 为什么会阻碍,我会og,但不能找到对加入的利用有多大帮助的解释。 谁能向我解释这一点?

关于

问题回答

你们是否真的需要在一个单独的进程中驾ly? 这对我来说相当不寻常。

想方设法使Twisted的反应堆成为你的主要通道,并放弃你所需要的一切,而不是试图运行 作为背景任务。

采取这种行动的更正常方式是使用Twisted s. callsLater,或向反应堆添加一个LoopingCall物体。

e.g.

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()

Hey asdvawev - .join () in multi treatment work一如 join() in threading - 它是一条主线的阻塞,等待工人关闭。 如果工人从不停下来,那么(......)就永远不会返回。 例如:

class myproc(Process):
    def run(self):
        while True:
            time.sleep(1)

要求这样做意味着加入(......)永远不会返回。 通常,为了防止出现这种疾病,我会利用一个被传入儿童过程的事件,让我在离开时发出信号:

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)

或者,如果你的工作被搁置一席之地,那么,你就能够把儿童进程放在离队的一边,直到孩子们碰到一个寄信器(通常在轮椅上没有进入),然后关闭。

这两项建议都意味着,在召集会议之前,你可以召集会议,或插入会议名称,在加入时,将完成目前的任务,然后适当撤出。





相关问题
热门标签