我正在尝试模拟使用twisted运行的应用程序网络.作为我的模拟的一部分,我想同步某些事件,并能够为每个进程提供大量数据.我决定使用多处理事件和队列.但是,我的流程越来越多.
我编写了下面的示例代码来说明问题.具体来说,(在我的沙桥机器上大约95%的时间),'run_in_thread'函数完成,但是在我按Ctrl-C之后才调用'print_done'回调.
此外,我可以更改示例代码中的一些内容,以使其更可靠地工作,例如:减少生成进程的数量,从reactor_ready调用self.ready.set或更改deferLater的延迟.
我猜在扭曲的反应堆和阻止多处理调用(如Queue.get()或Event.wait())之间存在竞争条件?
我遇到的问题究竟是什么?我的代码中是否有一个我遗漏的错误?我可以修复此问题,还是与多处理事件/队列不兼容?
其次,像spawnProcess或Ampoule这样的东西会被推荐吗?(正如Mix Python Twisted with multiprocessing中所建议的那样?)
编辑(根据要求):
我遇到了所有反应堆的问题,我试过glib2reactor selectreactor,pollreactor和epollreactor.epollreactor似乎给出了最好的结果,并且似乎对于下面给出的示例工作正常,但仍然在我的应用程序中给出了相同(或类似)的问题.我会继续调查.
我正在运行Gentoo Linux内核3.3和3.4,python 2.7,我尝试过Twisted 10.2.0,11.0.0,11.1.0,12.0.0和12.1.0.
除了我的沙桥机器,我在我的双核amd机器上看到了同样的问题.
#!/usr/bin/python
# -*- coding: utf-8 *-*
from twisted.internet import reactor
from twisted.internet import threads
from twisted.internet import task
from multiprocessing import Process
from multiprocessing import Event
class TestA(Process):
def __init__(self):
super(TestA, self).__init__()
self.ready = Event()
self.ready.clear()
self.start()
def run(self):
reactor.callWhenRunning(self.reactor_ready)
reactor.run()
def reactor_ready(self, *args):
task.deferLater(reactor, 1, self.node_ready)
return args
def node_ready(self, *args):
print 'node_ready'
self.ready.set()
return args …Run Code Online (Sandbox Code Playgroud)