Python多处理冻结叉炸弹

时间:2018-01-15 14:37:31

标签: 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

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

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

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

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

ctx = multiprocessing.get_context('fork')

使用fork而不是spawn的冷冻过程有什么用呢?可以改变冷冻过程以允许产卵吗?

1 个答案:

答案 0 :(得分:0)

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

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

https://bugs.python.org/issue32146

他们对修复有一些想法,希望这些修改能够成为3.7.x版本。