Python 为什么必须在 __name__ == '__main__' 子句中调用multiprocessing.set_start_method?



如果您想使用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只被调用一次。

它不需要特别在模块级,但它可以在通过该子句运行的任何函数中,并且仍然保证只调用一次。

最新更新