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

Python multiprocessing map函数报错:函数定义位置引发AttributeError咨询

关于Python multiprocessing.Pool.map函数的函数定义位置问题

问题场景

编写包含multiprocessing.map的Python代码时,遇到如下问题:

报错代码示例

import multiprocessing as mp

if __name__ == '__main__':

    def f(x):
        return x*x

    num_workers = 2
    with mp.Pool(num_workers) as p:
        print(p.map(f, [1,2,3]))

运行后抛出错误:

AttributeError: Can't get attribute 'f' on <module '__mp_main__' from 'main.py'>

正常运行代码示例

将函数f移到if __name__ == '__main__':代码块外部后,代码可正常执行:

import multiprocessing as mp

def f(x):
    return x*x

if __name__ == '__main__':

    num_workers = 2
    with mp.Pool(num_workers) as p:
        print(p.map(f, [1,2,3]))

差异与报错原因解析

  • 两种写法的核心差异:函数f的定义作用域不同。第一种写法中f定义在if __name__ == '__main__':的局部作用域内,第二种写法中f定义在模块的全局作用域。

  • 第一种写法报错的原因:

    • 使用multiprocessing.Pool创建子进程时,子进程会重新导入主模块(即你的main.py)。
    • 子进程导入模块时,__name__的值为__mp_main__而非__main__,因此if __name__ == '__main__':代码块内的代码不会被执行,函数f也就不会在子进程的命名空间中被定义。
    • 父进程尝试将函数f传递给子进程执行时,子进程在自身的模块命名空间中找不到f,从而抛出AttributeError。
  • 第二种写法正常运行的原因:

    • 函数f定义在模块全局作用域,子进程导入模块时会执行这部分代码,f会被正常定义在子进程的命名空间中,因此子进程可以找到并执行该函数。

内容的提问来源于stack exchange,提问作者user8036269

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:30:54