当多处理进程打开另一个进程时,程序在调试中挂起



在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')

相关内容

  • 没有找到相关文章

最新更新