Discuss / Python / 上文中from multiprocessing import Pool的那一段,但是在python交互模式运行的时候错误

上文中from multiprocessing import Pool的那一段,但是在python交互模式运行的时候错误

Topic source

ywjco_567

#1 Created at ... [Delete] [Delete and Lock User]

官方文档:

为了解释为什么 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


  • 1

Reply