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