我有一个很好的简单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版本。