Python multiprocessing freeze fork-bomb

Python multiprocessing freeze fork-bomb

我有一个不错的简单 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

结果实际上是一个叉子炸弹:

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

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

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

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 版本。