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)
从文档:
请注意,池对象的方法只能由创建池的进程调用.
当你打电话给pool.map()
内部时,你违反了规则f()
.此外,如果您尝试让子进程创建自己的池,您将收到一个断言错误:
AssertionError: daemonic processes are not allowed to have children
Run Code Online (Sandbox Code Playgroud)
这是不可能的。对象Pool
本身不能在进程之间安全地共享,因此同一个池不能在 和 中f
使用g
。即使您可以做到这一点,您很快也会导致挂起,因为您的池仅限于cpu_count()
并发工作人员。一旦你开始递归地创建更多的工人,你最终会得到比cpu_count()
工人更多的东西,这将永远无法完成;正在运行的工作线程将等待池中排队的任务,但排队的任务将永远无法启动,因为正在运行的任务正在等待。所以你最终陷入了僵局。简而言之:不要尝试这样做。