我有一个很好的简单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的冷冻过程有什么用呢?可以改变冷冻过程以允许产卵吗?
答案 0 :(得分:0)
我设法用Tools/freeze/freeze.py
script in the cpython repo重现问题,所以问题确实比cx_freeze或pyinstaller更深。
经过多次挖掘后,我发现我不是唯一一个遇到问题的人 - 在我遇到问题前一个月左右开了以下问题:
https://bugs.python.org/issue32146
他们对修复有一些想法,希望这些修改能够成为3.7.x版本。