Python多处理卡住叉炸弹

标签 python multiprocessing fork pyinstaller cx-freeze

我有一个非常简单的 Python 脚本:

import multiprocessing


def foo():
    print('running foo')


def main():
    print('start')
    ctx = multiprocessing.get_context('spawn')

    p = ctx.Process(target=foo)
    p.start()
    p.join()


if __name__ == '__main__':
    main()

它在使用 python 解释器调用时完全按照应有的方式运行:

$ python test.py
start
running foo

另一方面,尝试卡住脚本远没有那么好。

两者

pyinstaller test.py

cxfreeze test.py

导致什么是有效的 fork 炸弹:

$ ./dist/test/test
start
start
start
start
.
.
.

在 htop 中观察,我们看到确实产生了很多进程并且机器很快就锁定了。

将启动方法更改为 fork 而不是 spawn 不会导致 fork 炸弹。

ctx = multiprocessing.get_context('fork')

与 fork 配合使用而不是 spawn 的卡住过程是什么?是否可以更改卡住过程以允许产卵?

最佳答案

我设法重现了 Tools/freeze/freeze.py script in the cpython repo 的问题,所以问题确实比cx_freeze或pyinstaller更深。

经过更多挖掘后,我发现我不是唯一遇到问题的人 - 在我遇到问题前大约一个月打开了以下问题:

https://bugs.python.org/issue32146

他们有一些修复的想法,希望能将其纳入 3.7.x 版本。

关于Python多处理卡住叉炸弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265137/

相关文章:

Python:对同一个程序使用多个Python窗口

win32gui 中的 Python PyHANDLE 对象

python - pandas 中的字符串打印不正确

c - 如果使用管道时子进程数大于处理器数,进程是否会被阻塞?

java - 进程内通信方式

c - 如何获取子进程的完整返回值?

c - 为什么 vfork() 导致父进程崩溃(段错误)?

c++ - 在 C++ 中创建 Linux 进程

python - 为什么我的阅读行不会前进到下一行?

python - 如何从 Docker 容器中的 python 脚本连接到 Ubuntu 上的本地 SQL 服务器