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

如何向Python Pool.apply_async方法传递dict类型参数

Pool.apply_async传递dict参数卡住的解决方案

问题原因

你传递dict参数的写法本身是完全正确的,脚本卡住和dict传参无关,是Python多进程在Windows平台的启动机制导致的:

  • Windows系统下multiprocessing默认使用spawn方式创建子进程,子进程启动时会重新导入主模块的所有顶层代码
  • 你的代码中创建Pool、提交任务的逻辑没有加入口保护,会在每个子进程中反复执行,最终陷入无限创建进程的死循环导致卡住

修复方法

只需要把多进程相关的执行逻辑包裹在if __name__ == '__main__'的判断块中即可,避免子进程重复执行任务提交代码。
修正后的完整代码如下:

import multiprocessing as mp

def my_func(session, index):
    result = { "server": session['server'], "exit_code": session['exit_code'],"index": index }  
    return result
        
def my_callback(result):
    print(result)

if __name__ == '__main__':
    pool = mp.Pool(5)
    sessions = []
    sessions.append({"server": "foo.tld", "exit_code": 1})
    sessions.append({"server": "bar.tld", "exit_code": 0})

    for i, session in enumerate(sessions):
        # 原有dict传参写法完全合法,无需修改
        pool.apply_async(my_func, kwds={ "session": session, "index": i}, callback=my_callback)
    
    pool.close()
    pool.join()

额外排查建议

如果加了入口保护后仍然异常,可以给apply_async添加异常回调定位问题,示例如下:

def error_cb(e):
    print(f"子进程执行出错: {e}")

# 提交任务时添加error_callback参数
pool.apply_async(my_func, kwds={ "session": session, "index": i}, callback=my_callback, error_callback=error_cb)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:36:03