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

Jen*_*Jen 5 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)
Run Code Online (Sandbox Code Playgroud)

Bil*_*nch 5

从文档:

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

当你打电话给pool.map()内部时,你违反了规则f().此外,如果您尝试让子进程创建自己的池,您将收到一个断言错误:

AssertionError: daemonic processes are not allowed to have children
Run Code Online (Sandbox Code Playgroud)


dan*_*ano 2

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