Python 3.4 多进程递归 Pool.map()

5

我正在使用Ubuntu 14.04上的Python 3.4进行开发。我尝试使用递归的Pool.map()。在调用g()后,它会挂起并且永远不会返回。

import multiprocessing as mp

pool = mp.Pool()

def d(x):
    return x / 2.0


def f(x):
    w = pool.map(d, x)
    return w

def g():
    v = pool.map(f, [[1, 2], [3, 4]])

    print(v)
2个回答

5

文档中提到:

请注意,池对象的方法只应由创建池的进程调用。

当您在f()内部调用pool.map()时,您会违反此规则。此外,如果您尝试让子进程创建自己的池,则会收到断言错误:

AssertionError: daemonic processes are not allowed to have children

2
这是不可能的。 Pool 对象本身不能在进程之间安全共享,因此同一池无法在 f g 中使用。即使您可以这样做,您很快就会导致挂起,因为您的池限制为 cpu_count()并发工作程序。一旦您开始递归创建更多工作程序,您将得到超过 cpu_count()的工作程序,这些程序永远无法完成;正在运行的工作程序将等待在池中排队的任务,但排队的任务永远无法开始,因为正在运行的任务正在等待。所以你最终陷入僵局。简而言之:不要尝试这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接