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

