我知道 Twisted 对于多进程应用程序的局限性,但我的问题不同。我不是在尝试使用多个进程来运行服务器或客户端。我已经有一个正在运行的应用程序,它接受许多目录并对它们执行一些操作。我想将工作分成 block ,为每个子目录生成一个具有相同应用程序的进程。我可以通过从 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
而且您看不到在其他 block 中工作的工作人员的任何输出。
问题是当调用 reactor.stop()
时,它会停止所有的 react 器,因为每个进程都使用相同的 react 器。我认为当生成一个新进程时,所有堆栈都被复制了,但在这种情况下它复制了对 react 器的引用,所以所有进程都使用相同的 react 器对象。
有没有办法为每个进程实例化一个不同的 react 器对象? (好像它真的是一个完全不同的进程而不是子进程)
最佳答案
Is there a way to instantiate a different reactor object for each process? (as if it was really a completely different process and not a child process)
如果您真的是说 process
那么最好的方法是多次运行代码(和/或 fork
/exec
来创建新的来自初始流程的流程)。
管理多个 react 器并没有什么神奇之处,它的完成方式与您在任何其他上下文中运行多个程序的方式相同。
关于python - 在多个进程中运行整个 Twisted 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639412/