我有一个非常简单的 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
导致什么是有效的 fork 炸弹:
$ ./dist/test/test
start
start
start
start
.
.
.
在 htop 中观察,我们看到确实产生了很多进程并且机器很快就锁定了。
将启动方法更改为 fork
而不是 spawn
不会导致 fork 炸弹。
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多处理卡住叉炸弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265137/