concurrent.futures.ThreadPoolExecutor如何获取t1结果后不等t2完成直接返回
ThreadPoolExecutor无需等待所有任务完成的实现方案
问题根因
concurrent.futures.ThreadPoolExecutor的with上下文管理器在退出时会自动调用shutdown(wait=True),该方法会阻塞主线程,直到所有已提交的任务全部执行完成才会继续向下执行。- 你在拿到t1的返回值后提交了t2任务,紧接着
do_it函数返回触发with块退出,因此必须等待t2的6秒休眠完成后才会执行后续的总耗时打印逻辑,不符合预期。
解决方案
手动管理线程池的生命周期,不使用with上下文自动销毁,调用shutdown时设置wait=False,即可实现不等待后台任务完成,直接执行后续逻辑:
import concurrent.futures import time def do_it(): # 手动创建线程池,不使用with上下文管理 my_executor = concurrent.futures.ThreadPoolExecutor() t1 = my_executor.submit(doing, 3) ret_value = t1.result() t2 = my_executor.submit(some_func) # 设置wait=False,不阻塞等待所有任务完成,已提交的任务会继续后台运行 my_executor.shutdown(wait=False) return f"doing return is {ret_value}" def doing(num): print(f"Calculating Square for {num}") return num*num def some_func(): print("sleep for 6 sec") time.sleep(6) print("done sleeping 6 secs") start = time.perf_counter() print(do_it()) finish = time.perf_counter() print(f"total time {finish-start}")
运行修改后的代码即可得到你预期的输出:总耗时仅几毫秒,打印完返回结果和总耗时后,等待6秒才会输出t2的完成日志。
内容的提问来源于stack exchange,提问作者Sheshan Doye
相关产品推荐
相关产品推荐

