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

