python - 在多个进程中运行整个 Twisted 应用程序

标签 python multiprocessing twisted reactor

我知道 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/

相关文章:

python - scipy.sparse.linalg.eigs 因抽象线性运算符而失败

Django 向用户推送 HTTP 响应

python - 扭曲的 SSL 套接字连接速度变慢

python - 异常.AttributeError : EchoFactory instance has no attribute 'connection'

python - 我们可以访问并替换 xlsx 中的图像吗

python - psycopg2 在 executemany 语句中插入表名

javascript - Django 根据数据库条件限制拖放

linux - freeRTOS 和并行处理

Python 线程挂起

使用 QueueHandler 和 QueueListener 的 Python 日志记录 (logutils)