如何检查Python进程池中的已调度任务是否全部执行完成?
实现进程池任务全部完成后再执行后续代码的方法
当然有可行的实现方式啦!我结合你的代码给你分享两种常用且靠谱的方法,还会帮你修正代码里的小细节:
先修正代码的小问题
你原来的代码里,每次循环都会把futuresnan重新赋值为仅包含当前任务的列表,这样最后只能跟踪到最后一个任务。得先把所有提交的任务对象(future)收集到同一个列表里,才能监控所有任务的状态:
import concurrent.futures executornan = concurrent.futures.ProcessPoolExecutor(20) futuresnan = [] # 初始化空列表存储所有任务的future对象 for l, ch in enumerate(chunks): print("CHUNK NUMBER", l) print("CHUNKS", ch) # 把每个submit返回的future添加到列表中 future = executornan.submit(locals()[configid + 5].ftptester, ch) futuresnan.append(future)
方法1:使用concurrent.futures.wait()等待所有任务完成
这个方法会阻塞当前线程,直到所有任务都执行完毕,还可以顺便获取每个任务的返回结果:
# 等待所有任务完成 concurrent.futures.wait(futuresnan) # 如果需要处理每个任务的返回结果,可以遍历futuresnan for future in futuresnan: try: result = future.result() # 这里可以根据需求处理结果,比如打印、存储等 print(f"任务返回结果: {result}") except Exception as e: # 捕获任务执行过程中可能抛出的异常 print(f"任务执行出错: {e}") # 到这里所有任务都已完成,开始写后续代码 print("所有进程池任务执行完毕!启动后续逻辑...")
方法2:调用executor.shutdown()阻塞等待
shutdown()方法会关闭进程池,并且默认会等待所有已提交的任务执行完成(wait=True是默认参数,可省略)。这种方法更简洁,适合不需要单独处理每个任务结果的场景:
# 等待所有任务完成并关闭进程池 executornan.shutdown() # 等价于executornan.shutdown(wait=True) # 后续代码在这里写 print("所有进程池任务都搞定啦!开始执行后续代码...")
两种方法的区别:
- 方法1可以在等待完成后逐个获取任务结果,还能处理任务抛出的异常;
- 方法2更简洁,关闭进程池后无法再提交新任务,适合任务全部完成后就不再使用该进程池的场景。
内容的提问来源于stack exchange,提问作者chris1234
相关产品推荐
相关产品推荐

