Python3实现作业并行执行及multiprocessing报错解决求助
解决multiprocessing Pool.starmap的AttributeError问题
核心原因
这个报错本质是子进程无法找到你定义的perform_job函数,通常出现在两种场景:
perform_job函数被定义在了if __name__ == '__main__':代码块内部- 在交互式环境(比如Jupyter Notebook、Python命令行)中运行代码
具体解决方法
1. 调整函数定义位置(脚本运行场景)
把perform_job函数移到if __name__ == '__main__':代码块外面,保证子进程导入主模块时能找到这个函数。
示例代码结构:
import multiprocessing import json # 将函数放在全局作用域,不要嵌套在__main__块内 def perform_job(job_config): # 这里编写你的作业执行逻辑 print(f"执行作业: {job_config['name']}") return f"{job_config['name']} 执行完成" if __name__ == '__main__': # 加载JSON配置文件 with open('jobs_config.json', 'r') as f: jobs = json.load(f) # 初始化进程池并并行执行作业 with multiprocessing.Pool() as pool: # starmap要求每个任务参数以元组形式传入,单个参数也要包装成元组 results = pool.starmap(perform_job, [(job,) for job in jobs]) print(results)
2. 规避交互式环境限制(Jupyter/命令行场景)
multiprocessing在交互式环境下会存在模块导入的兼容性问题,建议将代码保存为.py脚本文件,在命令行中运行:
python your_script.py
如果必须在Jupyter中使用,可以改用spawn上下文创建进程池,同时保证函数在全局作用域:
import multiprocessing def perform_job(job_config): return f"{job_config['name']} 执行完成" if __name__ == '__main__': ctx = multiprocessing.get_context('spawn') with ctx.Pool() as pool: results = pool.starmap(perform_job, [(job,) for job in jobs])
额外注意事项
- 确保
perform_job函数及其依赖的所有代码都能被子进程访问,不要引用仅在__main__块中定义的变量 - 作业传递的参数必须是可序列化(pickle兼容)的对象,否则会触发新的报错
内容的提问来源于stack exchange,提问作者AbtPst
相关产品推荐
相关产品推荐

