🎃 ThreadPoolExecutor按顺序获取结果

【目标】

按照任务添加的顺序获取结果

【解决方法】

使用concurrent.futures.Future对象的add_done_callback()方法来注册一个回调函数,并在任务完成时处理结果

【示例】

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_result(future):
    res = future.result()
    params.append(res)

with ThreadPoolExecutor(max_workers=max_workers) as t:
    obj_list = []
    for item in sgpf:
        obj = t.submit(item.run, target)
        obj.add_done_callback(process_result)
        obj_list.append(obj)

# 等待所有任务完成
for item in obj_list:
    item.result()

在这个示例中:

  1. 定义一个名为process_result的回调函数,接收Future对象作为参数。
  2. 在回调函数中,获取了该Future对象的结果,并将其添加到params列表中。
  3. 在循环中,使用add_done_callback()方法为每个提交的任务注册了回调函数process_result
  4. 当任务完成时,回调函数被触发,并按照任务添加的顺序处理结果。

另外,添加了一个额外的循环,用于等待所有任务完成。(通过调用每个Future对象的result()方法,确保在继续执行后续代码之前,所有任务都已完成)