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

Python3实现作业并行执行及multiprocessing报错解决求助

解决multiprocessing Pool.starmap的AttributeError问题

核心原因

这个报错本质是子进程无法找到你定义的perform_job函数,通常出现在两种场景:

  1. perform_job函数被定义在了if __name__ == '__main__':代码块内部
  2. 在交互式环境(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:20