如果您想使用multiprocess
模块生成一个进程,而不是fork一个进程,您可以使用以下命令:
multiprocessing.set_start_method('spawn')
文档说明:
要选择一个开始方法,您可以在主模块的if
__name__ == '__main__'
子句中使用set_start_method()
然而,我发现我可以在if __name__ == '__main__'
子句之外调用set_start_method('spawn')
,并且它仍然在Unix上生成而不是分叉进程。
实际上,只要在第一次调用multiprocessing.Process()
之前调用set_start_method('spawn')
,它的行为就会像预期的那样。如果你在第一个multiprocessing.Process()
之后尝试调用set_start_method('spawn')
,它似乎被忽略了,将分叉而不是衍生。
为什么文档声明set_start_method
应该在if __name__ == '__main__'
子句中调用?
子进程不进入if __name__ == '__main__'
子句。这样我们就可以保证set_start_method
只被调用一次。
它不需要特别在模块级,但它可以在通过该子句运行的任何函数中,并且仍然保证只调用一次。