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

Posted

技术标签:

【中文标题】当多处理进程打开另一个进程时程序在调试中挂起【英文标题】:Program hangs in debug when multiprocessing process opens another process 【发布时间】:2018-08-16 22:53:08 【问题描述】:

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

【问题讨论】:

在 pycharm 2020 中遇到了类似的问题。您找到任何解决方案了吗? 很遗憾不是,@MichelePiccolini。但从那以后我没有调查过这个问题。 【参考方案1】:

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

【讨论】:

以上是关于当多处理进程打开另一个进程时程序在调试中挂起的主要内容,如果未能解决你的问题,请参考以下文章

tornado异步web请求

c ++线程等待用户IO('getchar()')在主进程中挂起'Py_Initialize()'

[在使用 PyVirtualDisplay 时] 如何避免挂起 Xvfb 进程?

Perl:关闭信号处理程序中的子进程管道挂起?

Visual Studio 2010 挂起附加到进程/调试

获取并暂停CMD中的进程线程