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
相关产品推荐
相关产品推荐

