Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 + as_completed 收结果

发布时间:2026/8/1 22:14:27

Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 + as_completed 收结果
Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 as_completed 收结果你手头有 200 个 URL 要抓,串行requests.get一个个跑,每个网络往返 300ms,光等待就是一分多钟,CPU 全程在打瞌睡。这类「一堆各自独立、主要在等 IO」的活儿,正是线程池的主场。但很多人第一次用ThreadPoolExecutor就踩坑:要么用map拿不到异常,要么用submit后不知道怎么优雅地边完成边收结果。这篇把这些坑一次讲清楚。朴素写法:串行,慢到肉眼可见先看最直白的版本,抓一批 URL 的状态码:importtimeimportrequestsdeffetch_status(url:str)-int:rrequests.get(url,timeout5)returnr.status_code urls[https://httpbin.org/delay/1]*10starttime.perf_counter()results[fetch_status(u)foruinurls]# 一个跑完才跑下一个print(results,f{time.perf_counter()-start:.1f}s)# [200, 200, ...] 10.x s —— 每个 delay 1 秒,10 个就是 10 秒10 个请求跑了 10 秒。但这些请求彼此毫无依赖,完全可以同时发出去。用 ThreadPoolExecutor.map 并发:能跑,但异常会「延迟爆炸」第一个改进是把列表推导换成线程池的map:fromconcurrent.futuresimportThreadPoolExecutorwithThreadPoolExecutor(max_workers10)aspool:resultslist(pool.map(fetch_status,urls))# 10 个请求几乎同时发出,总耗时约 1 秒max_workers10表示最多 10 个线程同时干活,with退出时会自动等所有任务结束再关池。速度从 10 秒降到 1 秒。但map有个隐蔽问题:它保持输入顺序,而且异常会在你迭代到那一项时才抛出。如果第 3 个 URL 挂了,前两个结果你都拿到了,迭代到第 3 个时才raise,这时候想知道「到底哪些成功了」就很别扭。而且map一旦某项抛异常,后面的结果你也拿不到了。正解:submit as_completed,谁先好谁先拿生产里更常用的是submit提交任务拿到Future,再用as_completed按「完成先后」而非「提交顺序」收结果。这样先跑完的先处理,慢的不拖累快的:fromconcurrent.futuresimportThreadPoolExecutor,as_completeddeffetch_status(url:str)-int:rrequests.get(url,timeout5)returnr.status_code urls[https://httpbin.org/delay/1,https://httpbin.org/status/404,https://httpbin.org/delay/2,https://not-a-real-host.invalid,# 故意让它失败]results,errors{},{}withThreadPoolExecutor(max_workers8)aspool:# future 反查 url,方便出错时知道是谁挂了future_to_url{pool.submit(fetch_status,u):uforuinurls}forfutureinas_completed(future_to_url):urlfuture_to_url[future]try:results[url]future.result()# 任务里抛的异常在这里重新抛出exceptExceptionase:errors[url]repr(e)print(成功:,results)print(失败:,errors)关键点在于future.result():如果任务函数内部抛了异常,异常被Future兜住,直到你调result()才重新抛出。所以用try/except包住它,就能把「成功的」和「失败的」分开收集,一个失败不影响其余任务。as_completed则保证谁先跑完谁先进循环,长尾任务不会阻塞短任务的处理。给任务加超时,别让一个卡死拖垮整批result(timeout...)可以给单个任务设等待上限。注意超时不会真的杀死线程(Python 线程无法强制中断),它只是让你别再干等:fromconcurrent.futuresimportTimeoutErrorasFutureTimeoutwithThreadPoolExecutor(max_workers8)aspool:futures{pool.submit(fetch_status,u):uforuinurls}forfutureinas_completed(futures,timeout10):# 整批 10 秒内必须收完urlfutures[future]try:print(url,future.result(timeout3))# 单个任务最多等 3 秒exceptFutureTimeout:print(url,该任务超时,先跳过)exceptExceptionase:print(url,失败:,e)真正的超时控制还得靠底层库自己支持,比如requests.get(url, timeout5)——线程池的 timeout 只是让主线程别一直傻等。线程池 vs 进程池:选错等于白干concurrent.futures还提供ProcessPoolExecutor,接口几乎一样,但适用场景相反:fromconcurrent.futuresimportProcessPoolExecutordefcpu_heavy(n:int)-int:returnsum(i*iforiinrange(n))# 纯计算,吃 CPU# CPU 密集用进程池,绕开 GIL,真正并行withProcessPoolExecutor(max_workers4)aspool:print(list(pool.map(cpu_heavy,[10**6]*4)))判断标准很简单:IO 密集(网络请求、读写文件、查数据库):线程主要在「等」,GIL 在等待时会释放,用ThreadPoolExecutor,max_workers可以开得比核心数大很多(几十到上百)。CPU 密集(加密、图像处理、大量数学计算):线程被 GIL 卡住无法并行,必须用ProcessPoolExecutor,max_workers一般设成 CPU 核心数。用线程池跑 CPU 密集任务,你会发现开多少线程都不快——因为 GIL 让它们始终只有一个在真正执行。小结独立的 IO 任务用ThreadPoolExecutor,一行with自动管理线程生命周期。优先submitas_completed,谁先完成谁先处理;用{future: 上下文}字典反查是哪个任务出的错。future.result()才是异常真正抛出的地方,用try/except包住它就能把成功与失败分流,单个失败不拖垮整批。result(timeout)只是让主线程别干等,真超时靠底层库(如requests的timeout)。一句话记忆:等 IO 用线程池,算 CPU 用进程池,收结果认准as_completed。

相关新闻

2026智能汽车OTA投诉分析:为什么OTA升级成功了,车辆却变差了?

2026智能汽车OTA投诉分析:为什么OTA升级成功了,车辆却变差了?

2026/8/1 22:14:27

摘要OTA 已经成为智能汽车持续迭代的核心能力,但用户投诉的重心正在变化:问题不再只是“升级包下不下来、装不装得上”,而是系统显示升级完成后,车机、影像、动力、续航和充电体验是否发生退化。本文基于 2026 年 6 月上半月中国车…

MemoRizz多租户应用开发:使用user_id实现用户数据隔离

MemoRizz多租户应用开发:使用user_id实现用户数据隔离

2026/8/1 22:14:27

MemoRizz多租户应用开发:使用user_id实现用户数据隔离 【免费下载链接】memorizz MemoRizz: A Python library serving as a memory layer for AI applications. Leverages popular databases and storage solutions to optimize memory usage. Provides utility cl…

Django数据库迁移双引擎:makemigrations与migrate深度解析

Django数据库迁移双引擎:makemigrations与migrate深度解析

2026/8/1 22:14:27

1. 项目概述:理解Django的数据库迁移双引擎如果你刚开始接触Django,或者已经用它做过几个项目,那么对python manage.py makemigrations和python manage.py migrate这两个命令一定不陌生。它们几乎是你每次修改模型(Model&#xff…

Agent-as-a-Judge进阶技巧:Ask Anything功能实现 workspace 智能问答

Agent-as-a-Judge进阶技巧:Ask Anything功能实现 workspace 智能问答

2026/8/1 23:14:41

Agent-as-a-Judge进阶技巧:Ask Anything功能实现 workspace 智能问答 【免费下载链接】agent-as-a-judge 👩‍⚖️ Agent-as-a-Judge: The Magic for Open-Endedness 项目地址: https://gitcode.com/gh_mirrors/ag/agent-as-a-judge Agent-as-a-J…

Java核心API实战技巧与性能优化指南

Java核心API实战技巧与性能优化指南

2026/8/1 23:14:41

1. Java常用API深度解析与实战技巧作为Java开发者,日常开发中熟练掌握核心API是基本功。但很多开发者停留在"会用"层面,缺乏对API设计原理和高效使用技巧的理解。这里分享我在金融和电商系统中积累的API实战经验。1.1 集合框架的高效使用Array…

树莓派7.5英寸电子纸HAT驱动与家庭信息中心项目实战

树莓派7.5英寸电子纸HAT驱动与家庭信息中心项目实战

2026/8/1 23:14:41

1. 项目概述:7.5英寸电子纸HAT入门指南如果你手头有一块树莓派,并且厌倦了它只能通过HDMI连接显示器,或者想做一个低功耗、常显不费电的显示终端,那么这块7.5英寸的电子纸(e-Paper)HAT绝对值得你花时间研究…

GPT-5.6 Luna脚踝斩80%:个人开发者怎么接?

GPT-5.6 Luna脚踝斩80%:个人开发者怎么接?

2026/8/1 23:14:41

Luna降了80%。0.20美元/百万token输入、1.20美元/百万token输出。Terra降了20%,Sol新增Fast mode,2倍价格换2.5倍速度。GPT-5.6发布才三周,价格先砍一刀。 先别急着欢呼。降价对你来说,是红利还是陷阱,取决于你站在哪…

IMX577 USB摄像头深度解析:从硬件拆解到Linux驱动与视觉测量实战

IMX577 USB摄像头深度解析:从硬件拆解到Linux驱动与视觉测量实战

2026/8/1 23:14:41

1. 从一颗明星传感器聊起:IMX577的“前世今生”如果你最近在捣鼓树莓派、Jetson Nano这类单板计算机,或者想给自己的PC加个摄像头搞点机器视觉、直播推流,那你大概率会听过“IMX577”这个型号。它就像消费电子摄像头领域的一颗“明星”&#…

PCIe转接板原理、选型与实战应用全解析

PCIe转接板原理、选型与实战应用全解析

2026/8/1 23:04:29

1. 项目缘起:为什么我们需要一块“C型”PCIe转接板?在折腾电脑硬件、搭建测试平台或者修复老旧设备时,很多朋友都遇到过这样的尴尬:主板上明明有一个空闲的PCIe x1插槽,但手头只有一块标准尺寸的PCIe x1扩展卡&#xf…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/8/1 16:37:34

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/8/1 0:15:49

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/8/1 4:47:48

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/1 0:03:03

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/1 0:03:03

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/1 0:03:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/1 0:03:03

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/1 0:03:03

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/1 0:03:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…