You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用concurrent.futures.ProcessPoolExecutor如何捕获并打印运行时错误?

如何捕获ProcessPoolExecutor子进程中的运行时错误

你当前的代码仅调用concurrent.futures.wait(futures)等待任务完成,但未主动处理每个任务的执行结果或异常——子进程抛出的异常会被封装在对应的Future对象中,不主动触发的话不会暴露,也就不会终止流程或输出错误信息。

下面是两种实用的处理方案:

方案一:等待所有任务完成后统一处理异常

遍历所有Future对象,通过result()方法触发子进程中的异常(若任务出错),再捕获并记录错误:

import concurrent.futures

executor = concurrent.futures.ProcessPoolExecutor(10)
futures = [executor.submit(operation, bag_candidate_idx) for bag_candidate_idx in range(total)]
concurrent.futures.wait(futures)

# 逐个处理任务结果与异常
for task_idx, future in enumerate(futures):
    try:
        # 调用result()会触发子进程中抛出的异常
        _ = future.result()
        # 可选:处理任务正常完成的结果
        # print(f"任务 {task_idx} 执行完成")
    except Exception as e:
        # 打印错误信息,也可替换为日志写入逻辑
        print(f"任务 {task_idx} 执行失败: {type(e).__name__} - {str(e)}")
        # 若需遇到错误就终止整个流程,添加以下代码
        # executor.shutdown(wait=False)
        # exit(1)

方案二:实时处理已完成任务的异常

使用as_completed()方法,一旦有任务完成(无论成功或失败)就立即处理,无需等待所有任务结束:

import concurrent.futures

executor = concurrent.futures.ProcessPoolExecutor(10)
futures = [executor.submit(operation, bag_candidate_idx) for bag_candidate_idx in range(total)]

for future in concurrent.futures.as_completed(futures):
    try:
        _ = future.result()
        # 可选:处理正常结果
    except Exception as e:
        print(f"任务执行失败: {type(e).__name__} - {str(e)}")
        # 可选:终止流程
        # executor.shutdown(wait=False)
        # exit(1)

额外说明

  • 子进程的异常会被序列化后传递到主进程,确保operation中抛出的异常是可序列化的(Python内置异常均满足要求)。
  • 若需将错误写入日志文件,建议使用Python标准库的logging模块,替换print为logging.error(),提前配置好日志输出路径即可。
  • 调用executor.shutdown(wait=False)会立即停止所有未完成的子进程,配合exit(1)可实现遇到错误就终止整个程序的需求。

内容的提问来源于stack exchange,提问作者puria azadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:06:32