Python多处理池永远不会完成

时间:2016-03-07 10:11:30

标签: python

我正在运行以下(示例)代码:

from multiprocessing import Pool

def f(x):
  return x*x

pool = Pool(processes=4)
print pool.map(f, range(10))

然而,代码永远不会完成。我做错了什么?

该行

pool = Pool(processes=4)

成功完成,它似乎在最后一行停止。甚至按ctrl + c都不会中断执行。我在Spyder的ipython控制台中运行代码。

2 个答案:

答案 0 :(得分:2)

from multiprocessing import Pool


def f(x):
    return x * x


def main():
    pool = Pool(processes=3)  # set the processes max number 3
    result = pool.map(f, range(10))
    pool.close()
    pool.join()
    print(result)
    print('end')


if __name__ == "__main__":
    main()

关键步骤是在过程完成后调用pool.close()pool.join()。否则,池不会释放。 此外,您应该在主流程中通过将代码放入if __name__ == "__main__":

中来创建池

答案 1 :(得分:1)

您的构造函数由于某种原因将解释器抛出到生成工厂的线程中。 你首先需要停止现在正在运行的所有线程,并且会有吨数。如果你打开任务管理器,你会看到大量的流氓 python.exe 任务。要批量杀死它们,请尝试:

taskkill /F /IM python.exe

您需要执行上述操作几次,并确保任务管理器不再显示python.exe任务。这也会杀死你的spyder实例。所以一定要保存。

现在将您的代码更改为以下内容:

from multiprocessing import Pool

def f(x):
  return x*x

if (__name__ == '__main__'):
   pool = Pool(4)
   print pool.map(f, range(10))

请注意,我已删除进程命名参数。