我有一个很好的简单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中,我们看到确实有许多进程生成,机器很快就会锁定。
将start方法更改为fork而不是spawn不会导致叉形炸弹。
ctx = multiprocessing.get_context('fork')

冷冻过程是如何与叉子和谐相处而不是产卵的?冻结过程是否可以更改为允许繁殖?

最佳答案

我设法用Tools/freeze/freeze.py script in the cpython repo重现了这个问题,因此这个问题确实比cx_freeze或pyinstaller更严重。
经过进一步的调查,我发现我并不是唯一一个有问题的人-以下问题是在我遇到问题前一个月打开的:
https://bugs.python.org/issue32146
他们有一些修复的想法,希望能使它成为3.7.x版本。

07-26 04:19