如何使用Python多进程池.starmap_async()运行多个函数并获取全部结果
问题原因与修复方案
核心问题排查
- 缩进错误:你当前代码中
result.get()的调用逻辑放在了if __name__ == '__main__'代码块之外。Windows系统下Python多进程默认采用spawn启动模式,子进程会重新导入整个执行脚本,不在main判断块内的代码会在子进程导入时被意外执行,直接导致变量作用域混乱、结果获取逻辑异常。 - 迭代器耗尽:如果你的
args是生成器、迭代器这类仅支持单次遍历的对象,第一次传给starmap_async时已经完成了全量遍历,第二次传入时已经为空,scatterfunc2没有参数可执行自然返回空结果。
修正后代码
from multiprocessing.pool import Pool import numpy as np # 你的自定义函数 def scatterfunc1(*params): # 原有逻辑 pass def scatterfunc2(*params): # 原有逻辑 pass if __name__ == '__main__': # 先将args转为列表,避免一次性迭代器耗尽问题 args = list(args) pool = Pool() result1_async = pool.starmap_async(scatterfunc1, args) result2_async = pool.starmap_async(scatterfunc2, args) # 结果获取逻辑必须放在main块内 result1 = np.asarray(result1_async.get(), dtype = float) result2 = np.asarray(result2_async.get(), dtype = float) # 回收进程池资源 pool.close() pool.join() # 后续可正常使用两个结果 print(result1.shape, result2.shape)
额外排查建议
如果调整后仍有异常,可以单独运行scatterfunc2的异步调用,排查函数本身是否存在无返回值、参数不匹配的逻辑问题。
内容的提问来源于stack exchange,提问作者M101
相关产品推荐
相关产品推荐

