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

Mat*_*sen 6 python multiprocessing python-3.x

如果您想使用模块生成一个进程,而不是派生一个进程multiprocess,则可以使用以下命令:

multiprocessing.set_start_method('spawn')
Run Code Online (Sandbox Code Playgroud)

文档指出

__name__ == '__main__'要选择启动方法,请在主模块的if 子句中使用 set_start_method()

然而,我发现我可以在子句set_start_method('spawn')之外调用if __name__ == '__main__',并且它仍然会在 Unix 上生成而不是派生进程。

事实上,只要您set_start_method('spawn')在第一次调用 之前调用multiprocessing.Process(),它就会按预期运行。set_start_method('spawn')如果您尝试在第一个之后调用multiprocessing.Process(),它似乎会被忽略并且会分叉而不是生成。

为什么文档规定set_start_method应该在子句中调用if __name__ == '__main__'

Bha*_*rel 5

子流程不进入if __name__ == '__main__'子句。这样我们就可以保证set_start_method只会被调用一次。

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