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

Python中exec函数内使用multiprocessing报错,需保留外层主入口判断

解决exec内使用multiprocessing且保留外层if __name__ == "__main__"的报错问题

错误原因

这个AttributeError的本质是多进程启动逻辑导致的:
当子进程启动时,会重新导入当前模块。你的外层代码被if __name__ == "__main__"包裹,只有主进程会执行这段exec代码;而子进程启动时,__name__会变成__mp_main__,不会触发外层的if判断,自然也不会执行exec里的代码,导致子进程的模块中找不到func函数。

解决方法

方法一:将函数定义移到模块全局作用域

把func的定义放到外层if __name__ == "__main__"之外,这样不管主进程还是子进程导入模块时,都能访问到这个函数:

def func():
    print(1)

if __name__ == "__main__":
    exec('''from multiprocessing import Pool
if __name__ == "__main__":
    with Pool(4) as pool:
        pool.apply_async(func)
        pool.close()
        pool.join()''')

方法二:在exec内确保函数被所有进程可见

如果必须把func定义在exec内部,可以将函数注册到__main__模块,同时调整exec内的代码结构,让子进程能间接获取到函数(需要确保主进程先完成注册):

if __name__ == "__main__":
    import __main__
    exec('''from multiprocessing import Pool
def func():
    print(1)
# 将函数注册到__main__模块,让子进程能找到
__main__.func = func

if __name__ == "__main__":
    with Pool(4) as pool:
        pool.apply_async(__main__.func)
        pool.close()
        pool.join()''')

这种方式的核心是主进程把func挂载到__main__模块的全局属性中,子进程启动后可以通过__main__.func访问到该函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:17:27