Python多进程Pool.map传递多参数:列表与变量作为输入
解决多进程Pool.map传递额外参数的问题
嘿,我来帮你搞定这个多进程传参的问题~multiprocessing.Pool.map()确实只能接受单个可迭代参数的函数,没法直接像你写的p.map(func, cust, time, chunksize=1)那样传多个参数。不过有两个常用的解决方案,我给你详细讲讲:
方法1:用functools.partial绑定固定参数
如果你的time是一个固定值(所有进程共用同一个时间),可以用functools.partial把这个参数预先绑定到func上,让它变成只需要一个参数的函数,这样就能直接用map了。
示例代码:
import multiprocessing import time from functools import partial def func(c, current_time): # 这里把time改成current_time,避免和模块名冲突 result_list = [c, current_time] # 不要用list当变量名,这是Python内置关键字 another_func(result_list) if __name__ == "__main__": cust = ['c1', 'c2', 'c3'] current_time = time.time() # 比如获取当前时间 # 用partial绑定current_time参数 bound_func = partial(func, current_time=current_time) p = multiprocessing.Pool() p.map(bound_func, cust, chunksize=1) p.close() p.join()
方法2:用starmap传递多参数元组
如果每个任务需要不同的参数(或者你更习惯显式传参),可以把cust里的每个元素和time打包成元组,然后用Pool.starmap()方法,它会自动把元组里的元素拆成函数的多个参数。
示例代码:
import multiprocessing import time def func(c, current_time): result_list = [c, current_time] another_func(result_list) if __name__ == "__main__": cust = ['c1', 'c2', 'c3'] current_time = time.time() # 把每个c和current_time打包成元组 args_list = [(c, current_time) for c in cust] p = multiprocessing.Pool() p.starmap(func, args_list, chunksize=1) p.close() p.join()
额外提醒:
- 你原来的代码里有个坑:变量名
time和导入的time模块重名了,这会导致后续调用time模块的方法报错,记得改成别的名字(比如current_time)。 - 不要用
list当变量名,这是Python的内置类型,会覆盖掉内置的list功能,换成result_list这类更有意义的名字。
内容的提问来源于stack exchange,提问作者Maik
相关产品推荐
相关产品推荐

