Python多线程:如何获取最先完成线程的返回结果?
最简实现方法
直接用concurrent.futures.ThreadPoolExecutor搭配wait方法指定return_when=FIRST_COMPLETED,就能快速拿到第一个完成的线程结果,忽略未完成的任务,总耗时由最快的线程决定(示例中为1秒)。
示例代码
import concurrent.futures import time def task1(): time.sleep(1) return 1 def task2(): time.sleep(5) return 2 if __name__ == "__main__": with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: # 提交两个任务 future1 = executor.submit(task1) future2 = executor.submit(task2) # 等待第一个完成的任务 done, not_done = concurrent.futures.wait( [future1, future2], return_when=concurrent.futures.FIRST_COMPLETED ) # 输出第一个完成任务的结果 for future in done: print(future.result()) # 输出1
方案优势
- 无需手动管理
threading.Event或复杂的join条件判断,concurrent.futures已封装好核心逻辑 - 上下文管理器会自动处理未完成线程的资源回收
- 代码简洁直观,完全匹配你要的最简需求
原生threading模块替代方案
如果坚持用原生threading,可以借助队列实现:
import threading import time import queue def task(q, delay, result): time.sleep(delay) q.put(result) if __name__ == "__main__": q = queue.Queue(maxsize=1) # 启动线程 t1 = threading.Thread(target=task, args=(q, 1, 1)) t2 = threading.Thread(target=task, args=(q, 5, 2)) t1.start() t2.start() # 阻塞获取第一个结果 result = q.get() print(result) # 输出1 # 若需终止未完成线程,可自定义退出标记让任务自行结束,原生线程无法强制终止
内容的提问来源于stack exchange,提问作者Ned Hulton
相关产品推荐
相关产品推荐

