Python使用ThreadPoolExecutor时如何匹配线程执行结果与入参
Python ThreadPoolExecutor 执行结果与入参关联方案
concurrent.futures.as_completed 会按照任务实际完成的顺序返回Future对象,和任务提交顺序不一定一致,因此无法直接用索引取data中的对应参数,推荐两种稳定实现方案:
方案1:建立Future与入参的映射字典
无需修改原有业务函数逻辑,提交任务时额外存储Future和对应入参的映射关系即可:
import concurrent.futures data = [[url1, 1], [url2, 2], [url3, 3]] lst = [] with concurrent.futures.ThreadPoolExecutor() as executor: # 用字典存储Future和对应入参的映射 future_to_params = {executor.submit(check, var1, var2): (var1, var2) for var1, var2 in data} for f in concurrent.futures.as_completed(future_to_params): result = f.result() # 从映射字典中直接取出当前Future对应的入参 related_params = future_to_params[f] if result: lst.append([result, related_params])
方案2:修改业务函数返回值携带入参
如果可以调整业务函数逻辑,直接让函数返回结果的同时带回入参,代码更简洁:
首先调整check函数返回值:
def check(var1, var2): # 原有业务逻辑保留 res = 原有业务计算逻辑 # 新增:把入参和结果一起返回 return res, var1, var2
调用代码调整为:
import concurrent.futures data = [[url1, 1], [url2, 2], [url3, 3]] lst = [] with concurrent.futures.ThreadPoolExecutor() as executor: results = [executor.submit(check, var1, var2) for var1, var2 in data] for f in concurrent.futures.as_completed(results): result, var1, var2 = f.result() if result: lst.append([result, [var1, var2]])
内容的提问来源于stack exchange,提问作者AstonKey
相关产品推荐
相关产品推荐

