繁体   English   中英

Python多处理冻结叉炸弹

[英]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中观察,我们看到确实产生了许多进程并且机器很快就锁定了。

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

ctx = multiprocessing.get_context('fork')

什么是关于冷冻过程与叉子很好地发挥,而不是产卵? 可以改变冷冻过程以允许产卵吗?

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

在进行了一些挖掘后,我发现我不是唯一一个遇到问题的人 - 在我遇到问题之前一个月左右开了以下问题:

https://bugs.python.org/issue32146

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM