如何向concurrent.futures.Executor.map传递常量列表参数?
解决方案
方法1:使用functools.partial绑定常量参数
通过partial把常量列表b预先绑定到函数f的第二个参数上,让executor.map只需遍历传递a中的单个元素即可。
from concurrent.futures import ThreadPoolExecutor from functools import partial def f(x, constant_list): # 这里编写你的函数逻辑,示例返回x和常量列表的组合 return (x, constant_list) a = [1,2,3] b = ["constant", "values"] # 固定第二个参数为b bound_f = partial(f, constant_list=b) with ThreadPoolExecutor() as executor: results = executor.map(bound_f, a) # 处理返回结果 for res in results: print(res)
方法2:用itertools.repeat重复传递常量
借助itertools.repeat让常量列表b被重复传递,次数与a的元素个数一致,保证executor.map每次调用f时,第二个参数都是完整的b。
from concurrent.futures import ThreadPoolExecutor import itertools def f(x, constant_list): return (x, constant_list) a = [1,2,3] b = ["constant", "values"] with ThreadPoolExecutor() as executor: # repeat(b)生成的迭代器会自动匹配a的长度 results = executor.map(f, a, itertools.repeat(b)) for res in results: print(res)
方法3:用multiprocessing模块实现
如果使用multiprocessing,可以通过以下两种方式实现需求:
方式A:结合partial和Pool.map
from multiprocessing import Pool from functools import partial def f(x, constant_list): return (x, constant_list) a = [1,2,3] b = ["constant", "values"] bound_f = partial(f, constant_list=b) if __name__ == "__main__": with Pool() as pool: results = pool.map(bound_f, a) for res in results: print(res)
方式B:用Pool.starmap传递元组参数
from multiprocessing import Pool def f(x, constant_list): return (x, constant_list) a = [1,2,3] b = ["constant", "values"] if __name__ == "__main__": # 生成每个元素为(x, b)的迭代器 args_iter = ((x, b) for x in a) with Pool() as pool: results = pool.starmap(f, args_iter) for res in results: print(res)
内容的提问来源于stack exchange,提问作者beginner_
相关产品推荐
相关产品推荐

