我有一个任务,需要运行多个子任务,每个子任务都在自己的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_a
和task_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)
但是,考虑到以上有关“僵尸孙子”的引用,看来这不是一个好的设计。
所以我想我的问题是: