You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:54:04