Python多进程中如何正确将map输出作为starmap_async参数
问题原因
你写的简化版传参出现元组嵌套,问题出在两处:
- 额外给
map(repeat, [a,b,c,d])的结果套了list()和外层repeat(),相当于构造了一个不断返回固定值的迭代器 - 没有对map生成的多个独立
repeat迭代器做解包,zip最终只收到两个入参:遍历my_list的迭代器、返回固定值的迭代器,生成的参数自然是(列表元素, 固定值元组)的嵌套结构。
修正方法
用*对map生成的迭代器序列做解包,去掉多余的外层包装即可,和你最初手写多个repeat()的逻辑完全等价,写法更简洁:
import multiprocessing as mp from itertools import repeat def f(a,b,c,d): return (a,b,c,d) my_list = [1,2,3,4,5] # 以下a/b/c/d替换为你实际的固定常量 a, b, c, d = "const_a", "const_b", "const_c", "const_d" cpu_num = mp.cpu_count() with mp.Pool(cpu_num) as pool: # 关键:*解包map生成的多个repeat迭代器,作为zip的独立入参 res = pool.starmap_async(f, zip(my_list, *map(repeat, [a, b, c, d]))) pool.close() pool.join() print(res.get())
运行后生成的参数序列完全符合预期:
[(1, 'const_a', 'const_b', 'const_c', 'const_d'), (2, 'const_a', 'const_b', 'const_c', 'const_d'), (3, 'const_a', 'const_b', 'const_c', 'const_d'), (4, 'const_a', 'const_b', 'const_c', 'const_d'), (5, 'const_a', 'const_b', 'const_c', 'const_d')]
这种写法在固定常量较多时维护性更好,后续增减固定参数只需要调整常量列表即可,不需要逐个增删
repeat()调用。
内容的提问来源于stack exchange,提问作者Ehsan Fathi
相关产品推荐
相关产品推荐

