Python中multiprocessing.Pool的starmap方法返回值顺序是否与传参顺序一致
问题1:starmap返回结果的顺序是否和传参顺序对应?
可以100%确定,multiprocessing.Pool提供的starmap()、map()、imap()方法,返回结果的索引严格与传入的参数组顺序一一对应,和子进程实际执行的先后顺序无关。你给出的判断完全成立:
poolReturn[0]=3 #1+2
poolReturn[1]=5 #2+3
poolReturn[2]=9 #4+5
你额外加序号追踪顺序的操作在使用starmap的场景下是完全多余的,直接使用原生返回的poolReturn列表即可。
问题2:确需追踪序号时的更优方案
如果你使用的是imap_unordered这类不保证返回顺序的API,确实需要手动追踪序号,也不需要用字典包装返回值,更简洁的实现是返回(序号, 计算结果)的元组:
from multiprocessing import Pool def myFoo(poolNb, par1, par2): res = par1 + par2 return poolNb, res inputPar = [(1,2),(2,3),(4,5)] with Pool() as pool: # 构造带序号的传参 params = [[idx, *par] for idx, par in enumerate(inputPar)] poolReturn = pool.starmap(myFoo, params) # 按序号排序得到顺序对齐的结果列表 sorted_result = [res for _, res in sorted(poolReturn, key=lambda x: x[0])] # 直接提取指定序号的结果 target_idx = 1 target_res = next(res for idx, res in poolReturn if idx == target_idx)
该方案相比字典包装的写法性能更高,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

