我有一个简单易懂的 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
尝试冻结脚本的操作并不好。相比之下,两者都需要使用HTML标签。
pyinstaller test.py
并且
cxfreeze test.py
导致实际上是一个分叉炸弹:
$ ./dist/test/test
start
start
start
start
.
.
.
观察htop,我们会发现确实有很多进程被生成,导致机器很快就会锁定。
将启动方法从spawn
改为fork
,不会导致分叉炸弹。
ctx = multiprocessing.get_context('fork')
冻结过程中与fork相容而不是spawn的原因是什么?冻结过程是否可以更改以允许spawn?
freeze_support()
。不过在 Linux 上似乎没什么用。 - Jean-François Fabrefreeze_support()
,但没有改变。 - Samfork
和spawn
之间的区别,除了文档中概述的传递给新进程的资源方面的差异。 - Sam