Python multiprocessing freeze fork-bomb
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 中观察,我们看到确实产生了很多进程并且机器很快就锁定了。
将启动方法更改为 fork
而不是 spawn
不会导致分叉炸弹。
ctx = multiprocessing.get_context('fork')
与 fork 配合使用而不是 spawn 的冻结过程是什么?可以更改冻结过程以允许生成吗?
我设法重现了 Tools/freeze/freeze.py
script in the cpython repo 的问题,所以问题确实比 cx_freeze 或 pyinstaller 更深。
经过更多的挖掘,我发现我不是唯一遇到问题的人 - 在我遇到问题前大约一个月打开了以下问题:
https://bugs.python.org/issue32146
他们有一些修复的想法,希望能将其纳入 3.7.x 版本。
我有一个不错的简单 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 的冻结过程是什么?可以更改冻结过程以允许生成吗?
我设法重现了 Tools/freeze/freeze.py
script in the cpython repo 的问题,所以问题确实比 cx_freeze 或 pyinstaller 更深。
经过更多的挖掘,我发现我不是唯一遇到问题的人 - 在我遇到问题前大约一个月打开了以下问题:
https://bugs.python.org/issue32146
他们有一些修复的想法,希望能将其纳入 3.7.x 版本。