我正在运行以下(示例)代码:
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控制台中运行代码。
答案 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))
请注意,我已删除进程命名参数。