我知道Twisted对多进程应用程序的限制,但我的问题不同。我不是试图使用多个进程运行服务器或客户端。我已经有一个正在运行的应用程序,它需要许多目录并对它们执行一些操作。我想以块的形式划分工作,为每个子目录生成一个具有相同应用程序的进程。我可以通过从shell多次运行应用程序并每次传递一个不同的子目录作为参数来完成此操作。
总的来说,我有类似的东西:
from multiprocessing import Pool
...
p = Pool(num_procs)
work_chunks = [work_chunk] * len(configs)
p.map(run_work_chunk, zip(work_chunks, configs))
p.close()
p.join()
其中:
def run_work_chunk((work_chunk, config)):
from twisted.internet import reactor
d = work_chunk.configure(config)
d.addCallback(lambda _: work_chunk.run())
d.addErrback(handleLog)
print "pid=", getpid(), "reactor=", id(reactor)
reactor.run()
return
class WorkChunk(object):
...
def run(self):
# do stuff
...
reactor.stop()
假设num_procs
为2,那么输出将是:
pid = 2 reactor = 140612692700304
pid = 6 reactor = 140612692700304
你看不到其他工作人员的任何输出。
问题在于,当调用reactor.stop()
时,它会停止所有反应堆,因为每个过程都使用相同的反应堆。我认为在生成一个新进程时,所有堆栈都被复制了,但在这种情况下,它会将引用复制到reactor,因此所有进程都使用相同的reactor对象。
有没有办法为每个进程实例化不同的reactor对象? (好像这是一个完全不同的过程而不是子过程)
答案 0 :(得分:0)
有没有办法为每个进程实例化不同的reactor对象? (好像这是一个完全不同的过程而不是子过程)
如果您的意思是process
,那么最好的方法是多次运行代码(和/或fork
/ exec
以从初始流程创建新流程。)
管理多个反应堆没有任何魔力,它的运行方式与在任何其他环境中运行多个程序的方式相同。