如何从多个流程中分散多个流程

时间:2019-10-16 22:34:12

标签: python multiprocessing python-multiprocessing

我有一个任务,需要运行多个子任务,每个子任务都在自己的vm上运行,然后在所有子任务完成后,合并结果并将其呈现给调用方。

我已经使用multiprocessing.Pool实现了此功能,并且效果很好。

我现在想扩大规模,同时运行多个这些任务。

我的最初设计是将我的任务包装在另一个multiprocessing.Pool中,其中每个任务都在其进程中运行,有效地散布如下:

job
+----- task_a
|      +------ subtask_a1
|      +------ subtask_a2
|      +------ subtask_a3
+----- task_b
       +------ subtask_b1
       +------ subtask_b2
       +------ subtask_b3
  • job使用两个过程来启动multiprocessing.Pool,一个过程用于task_a,另一个过程用于task_b
  • 依次,task_atask_b分别以3个进程开始multiprocessing.Pool,每个子任务一个。

当我尝试运行代码时,我遇到了断言错误:

AssertionError: daemonic processes are not allowed to have children

在线搜索详细信息,我发现了following thread,其摘录如下:

  

关于允许子线程使用自己的方法产生自己的子代   子流程冒着创建少量僵尸大军的风险   'grandchildren',如果父线程或子线程终止   子流程完成并返回

我还发现workarounds允许使用这种“池中的池”:

class NoDaemonProcess(multiprocessing.Process):
    @property
    def daemon(self):
        return False

    @daemon.setter
    def daemon(self, value):
        pass

class NoDaemonContext(type(multiprocessing.get_context())):
    Process = NoDaemonProcess

class MyPool(multiprocessing.pool.Pool):
    def __init__(self, *args, **kwargs):
        kwargs['context'] = NoDaemonContext()
        super(MyPool, self).__init__(*args, **kwargs)

但是,考虑到以上有关“僵尸孙子”的引用,看来这不是一个好的设计。

所以我想我的问题是:

  • 在多个进程中“扇出”多个进程的pythonic方法是什么?

0 个答案:

没有答案