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

Python使用ThreadPoolExecutor时丢失执行行问题排查与代码优化求助

问题原因与优化方案

核心问题排查

你遇到的输出丢失和shutdown函数无关,ThreadPoolExecutor搭配with上下文管理器使用时,会自动执行shutdown(wait=True)等待所有任务执行完成再退出上下文,无需额外手动调用shutdown函数。输出不足100条的原因有3个:

  • 存在错误的线程调用:你代码里的executor.submit(getName)没有传入getName要求的url参数,会直接抛出TypeError,子线程异常默认不会输出到主线程,同时多余的异常线程也会干扰执行逻辑
  • print函数线程不安全:多线程同时调用print写入标准输出时,内容会互相覆盖、丢失,这是输出行数不足的最核心原因
  • 缺少异常捕获逻辑:网络请求可能出现超时、接口报错、返回结构异常等问题,没有捕获异常的线程会直接终止,不会输出结果

优化后代码

import concurrent.futures
import requests
import time

# 简化列表生成逻辑
URLList = ["https://randomuser.me/api/" for _ in range(100)]

def getName(urlApi):
    try:
        # 增加超时参数避免请求无限卡住
        resp = requests.get(urlApi, timeout=10)
        # 捕获HTTP层面的错误(4xx/5xx状态码)
        resp.raise_for_status()
        return resp.json()["results"][0]["name"]
    except Exception as e:
        # 所有异常统一捕获返回,避免线程直接终止
        return f"请求失败,错误信息:{str(e)}"

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
        # 移除错误的submit调用,仅保留map批量提交任务,map会按顺序返回所有执行结果
        results = executor.map(getName, URLList)
    # 所有任务执行完成后统一输出,彻底解决print线程不安全的问题
    for res in results:
        print(res)

if __name__ == "__main__":
    start_time = time.time()
    main()
    midtime = time.time() - start_time
    print(f"--- {midtime} seconds ---")

优化说明

  • 移除了错误的无参submit调用,避免不必要的线程异常
  • 增加了全链路异常捕获,不会因为个别请求失败导致无输出
  • 把结果收集和输出逻辑拆分,所有任务执行完成后再统一打印,完全避免多线程同时写标准输出的覆盖问题
  • 增加了请求超时控制,避免个别请求卡住拖慢整体执行速度

内容的提问来源于stack exchange,提问作者somebody coding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:36:03