在python程序中,使用multiprocessing.Process
打开一个进程。然后,此过程正在创建一个Pool
,以便使用map()
方法为其提供一些工作。
当程序正常运行时,所有工作都按预期工作。但是,当它在 PyCharm 调试器中运行时,对Pool.map
的调用永远不会返回,并且程序被锁定。
以下简单示例演示了该问题:
1) 代码:
import multiprocessing
def inc(a):
return a + 1;
def func():
p = multiprocessing.Pool(2)
print("before map")
res = p.map(inc, [1,4]) # ==> the method hangs in debug.
print("after call map")
p.close()
p.join()
print(res)
def main():
p = multiprocessing.Process(target=func)
p.start()
p.join()
if __name__ == '__main__':
main()
2) 程序运行时按预期输出:
before map
after call map
[2, 5]
Process finished with exit code 0
3) 程序在调试器中运行时的输出 - 永远不会完成:
pydev debugger: process 13792 is connecting
Connected to pydev debugger (build 173.4301.16)
before map
这只是一个非常烦人的调试问题(可能是由调试器后台线程引起的? 还是在实际运行中也可能出现的多处理问题?
应该提到的是,仅使用其中一个子处理步骤,这意味着要么只打开一个Process()
,要么只使用一个pool.map()
,不会造成任何问题,并且可以进行调试。如前所述,该问题仅出现在"嵌套"子循环中。
我在Windows 10 64位机器上运行PyCharm。
我刚刚遇到了类似的问题,发现我在使用map()
方法调用的函数中放置了一个断点。删除此断点或忽略断点为我解决了问题。希望这有帮助。
我不知道确切的原因,但我可以说对于我的 m1 mac,挂起是由于没有明确设置 start 方法引起的:
multiprocessing.set_start_method('spawn')