Python 3.4多处理递归Pool.map()

时间:2014-08-20 16:41:16

标签: python recursion multiprocessing

我在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 个答案:

答案 0 :(得分:5)

From the documentation

  

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

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

AssertionError: daemonic processes are not allowed to have children

答案 1 :(得分:2)

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