Mac系统下Multiprocessing示例代码运行抛出AttributeError异常
问题原因
- 该报错与macOS平台下Python多进程的默认启动方式变更直接相关:从Python 3.8版本开始,macOS上
multiprocessing的默认启动方法从fork改为spawn,你重装的最新版Anaconda3大概率内置了3.8及以上版本的Python,因此触发了该问题。 spawn模式启动子进程时,会重新导入主模块获取目标函数上下文。如果你的代码是在交互式环境(Jupyter/IPython/直接在Python Shell中运行)下执行,__main__模块属于内置模块,子进程导入时无法获取你在交互环境中临时定义的函数f,就会抛出该属性错误。- 之前代码可以正常运行,是因为旧版本Anaconda内置的Python版本低于3.8,默认使用
fork启动方式,不需要重新导入主模块即可获取函数上下文。
解决方法
分不同运行场景选择对应方案:
场景1:代码写在.py脚本文件中运行
在多进程执行逻辑外添加if __name__ == '__main__'保护即可,修改后的代码示例:
from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': with Pool(5) as p: print(p.apply(f, [1]))
场景2:在交互式环境(Jupyter Notebook/Lab、IPython)中运行
有两种可选方案:
- 方案1:手动将多进程启动方式改回
fork,在代码开头添加以下逻辑:
import multiprocessing multiprocessing.set_start_method('fork') from multiprocessing import Pool def f(x): return x*x with Pool(5) as p: print(p.apply(f, [1]))
注意:
fork模式在macOS上存在少量已知稳定性问题,和部分系统框架交互时可能出现意外崩溃,仅推荐临时测试使用。
- 方案2:将需要调用的函数放到独立的
.py文件中,再导入使用。比如先创建utils.py写入f函数的定义,再在交互环境中执行from utils import f,之后就可以正常调用多进程接口。
内容的提问来源于stack exchange,提问作者Qinyang Tan
相关产品推荐
相关产品推荐

