官方文档:
为了解释为什么 if __name__ == '__main__' 部分是必需的,请参见 Programming guidelines。
主模块安全导入
确保新的python解释器可以安全地导入主模块,而不会造成意外的副作用(例如启动新的进程)。
例如,使用spawn或forkserver start方法运行以下模块将失败,并出现运行时错误(RuntimeError):
from multiprocessing import Process def foo(): print('hello') p = Process(target=foo) p.start()
相反,应该使用if __name__ == '__main__':来保护程序的“入口点”,如下所示:
from multiprocessing import Process, freeze_support, set_start_method def foo(): print('hello') if __name__ == '__main__': freeze_support() set_start_method('spawn') p = Process(target=foo) p.start()
(如果程序将正常运行而不是冻结,则可以省略freeze_support()行。)
这允许新生成的python解释器安全地导入模块,然后运行模块的foo()函数。
如果在主模块中创建了池或管理器,则使用类似的限制。
参考链接:
https://docs.python.org/zh-cn/3.7/library/multiprocessing.html?highlight=more%20picklability#programming-guidelines
Sign in to make a reply
ywjco_567
官方文档:
为了解释为什么 if __name__ == '__main__' 部分是必需的,请参见 Programming guidelines。
主模块安全导入
确保新的python解释器可以安全地导入主模块,而不会造成意外的副作用(例如启动新的进程)。
例如,使用spawn或forkserver start方法运行以下模块将失败,并出现运行时错误(RuntimeError):
相反,应该使用if __name__ == '__main__':来保护程序的“入口点”,如下所示:
(如果程序将正常运行而不是冻结,则可以省略freeze_support()行。)
这允许新生成的python解释器安全地导入模块,然后运行模块的foo()函数。
如果在主模块中创建了池或管理器,则使用类似的限制。
参考链接:
https://docs.python.org/zh-cn/3.7/library/multiprocessing.html?highlight=more%20picklability#programming-guidelines