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

时间:2018-03-08 14:31:51

标签: python multiprocessing pycharm pydev python-multiprocessing

在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。

1 个答案:

答案 0 :(得分:0)

我刚刚遇到了类似的问题,并发现我在使用 map() 方法调用的函数内放置了一个断点。删除此断点或忽略断点为我解决了问题。希望这会有所帮助。