Python 并发请求实战:用 asyncio 把批量 API 调用提速 10 倍
在数据采集、AI 模型调用、文件处理等项目中我们经常需要批量请求 API。最直接的写法是使用requests逐个发送请求但当任务数量达到几百甚至几千时串行执行会浪费大量时间。这篇文章将从一个简单案例出发介绍如何使用 Python 的asyncio和aiohttp实现并发请求并补充超时控制、限流、重试等实际项目中不可缺少的机制。一、为什么串行请求速度慢假设我们需要请求 100 个接口每个接口平均响应时间为 500 毫秒。使用串行方式时总耗时大约为100 × 0.5 秒 50 秒传统写法如下import requests def fetch(url): response requests.get(url, timeout10) response.raise_for_status() return response.json() urls [ fhttps://example.com/api/items/{item_id} for item_id in range(100) ] results [] for url in urls: results.append(fetch(url))这段代码的问题并不在于单次请求慢而在于程序发出请求后会一直等待服务器返回结果。在等待期间CPU 几乎没有做任何事情。对于这种以网络等待为主的 I/O 密集型任务并发执行通常能够显著缩短整体耗时。二、使用 asyncio 和 aiohttp 实现并发首先安装依赖pip install aiohttp然后将串行代码改造成异步版本import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: response.raise_for_status() return await response.json() async def main(): urls [ fhttps://example.com/api/items/{item_id} for item_id in range(100) ] async with aiohttp.ClientSession() as session: tasks [ fetch(session, url) for url in urls ] results await asyncio.gather(*tasks) print(f成功获取 {len(results)} 条数据) if __name__ __main__: asyncio.run(main())这里有三个关键点使用async def定义异步函数。使用await等待网络请求完成。使用asyncio.gather()同时调度多个任务。程序不再等待一个请求结束后才发送下一个请求而是可以在等待某个接口响应时继续处理其他请求。三、并发不是越高越好如果一次性创建几千个请求可能会遇到以下问题触发服务端限流本地连接数耗尽内存占用快速上升大量请求同时超时被目标服务判断为异常流量。因此实际项目中通常要使用信号量限制并发数量。import asyncio import aiohttp CONCURRENCY 10 semaphore asyncio.Semaphore(CONCURRENCY) async def fetch(session, url): async with semaphore: async with session.get(url) as response: response.raise_for_status() return await response.json()当CONCURRENCY设置为 10 时程序最多同时执行 10 个请求。其他任务会进入等待状态直到有可用的并发名额。并发数没有适用于所有项目的固定答案可以从 520 开始测试再根据接口限流规则、服务器性能和实际响应时间进行调整。四、为请求设置超时时间没有超时控制的网络请求可能会长时间挂起最终拖慢整个任务。aiohttp可以为连接建立、数据读取和总体请求分别设置超时timeout aiohttp.ClientTimeout( total15, connect5, sock_read10, ) async with aiohttp.ClientSession(timeouttimeout) as session: # 执行请求 pass其中total一次请求允许消耗的总时间connect建立连接的最长等待时间sock_read读取数据时允许等待的时间。在生产环境中不建议完全关闭超时。外部服务出现异常时超时机制是保护任务稳定性的第一道防线。五、加入自动重试机制网络抖动、服务临时不可用和接口限流都可能导致请求失败。对于偶发错误可以采用指数退避策略进行重试。import asyncio import aiohttp async def fetch_with_retry(session, url, max_retries3): for attempt in range(max_retries): try: async with session.get(url) as response: response.raise_for_status() return await response.json() except ( aiohttp.ClientError, asyncio.TimeoutError, ) as error: if attempt max_retries - 1: raise error wait_seconds 2 ** attempt await asyncio.sleep(wait_seconds)三次请求之间的等待时间依次为1 秒、2 秒、4 秒这种策略比固定间隔重试更合理因为它可以给异常服务留出逐步恢复的时间也能降低大量客户端同时重试造成的压力。需要注意并不是所有失败都应该重试。例如参数错误导致的400 Bad Request即使重新发送请求通常也不会成功。比较适合重试的情况包括请求超时连接被临时中断429 Too Many Requests部分5xx服务端错误。六、一个更完整的并发请求模板下面组合并发限制、超时和重试机制形成一个可以直接用于项目的基础模板import asyncio import aiohttp CONCURRENCY 10 MAX_RETRIES 3 async def fetch(session, semaphore, url): async with semaphore: for attempt in range(MAX_RETRIES): try: async with session.get(url) as response: response.raise_for_status() return { url: url, success: True, data: await response.json(), } except ( aiohttp.ClientError, asyncio.TimeoutError, ) as error: if attempt MAX_RETRIES - 1: return { url: url, success: False, error: str(error), } await asyncio.sleep(2 ** attempt) async def main(): urls [ fhttps://example.com/api/items/{item_id} for item_id in range(100) ] semaphore asyncio.Semaphore(CONCURRENCY) timeout aiohttp.ClientTimeout( total15, connect5, sock_read10, ) connector aiohttp.TCPConnector( limitCONCURRENCY ) async with aiohttp.ClientSession( timeouttimeout, connectorconnector, ) as session: tasks [ fetch(session, semaphore, url) for url in urls ] results await asyncio.gather(*tasks) successful [ item for item in results if item[success] ] failed [ item for item in results if not item[success] ] print(f成功{len(successful)}) print(f失败{len(failed)}) if __name__ __main__: asyncio.run(main())这个模板有一个重要特点单个请求失败时不会直接终止全部任务而是将成功和失败结果统一返回方便后续记录日志、补偿重试或人工排查。类似的并发处理方式也适用于批量调用 AI 服务例如文本摘要、内容审核、同言翻译等场景。七、异步并发在 AI 翻译场景中的应用异步并发不仅适合普通的数据接口也很适合文本摘要、内容审核和智能翻译等 AI 应用。以同言翻译为例当系统需要同时处理多段文本或多个翻译任务时可以通过异步请求减少等待时间让不同任务并行执行从而提升整体处理效率。在这类场景中除了控制并发数量还需要重点处理请求超时、接口限流和失败重试等问题。如果某个翻译任务临时失败程序可以单独记录并重新提交而不必让整个批处理流程中断。因此无论是开发翻译工具还是在现有业务中接入多语言能力本文介绍的asyncio、并发限制和自动重试机制都具有一定的参考价值。八、常见问题与避坑建议1. 不要为每个请求创建一个 Session错误示例async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.json()频繁创建ClientSession会导致连接无法得到有效复用并增加额外开销。更合理的做法是在任务开始时创建一个 Session让所有请求共享。2. asyncio 不适合直接处理 CPU 密集型任务异步编程主要解决网络、磁盘等 I/O 等待问题。如果任务是图片压缩、视频转码或复杂计算单纯改成async并不会明显提速。CPU 密集型任务更适合使用multiprocessingProcessPoolExecutor独立的任务队列与工作进程。3. gather 默认会传播异常当某个任务抛出未处理异常时asyncio.gather()可能直接将异常向外抛出。因此最好在任务内部捕获可预期的网络异常或者使用results await asyncio.gather( *tasks, return_exceptionsTrue, )不过开启return_exceptionsTrue后结果列表中可能同时包含正常数据和异常对象后续处理时需要主动判断类型。4. 注意接口的限流规则并发能力不等于可以忽略对方的接口规范。如果 API 明确限制每秒请求次数还需要增加速率控制而不能只限制同时运行的请求数量。例如限制并发数为 10只能保证同一时刻最多有 10 个请求并不能保证每秒只发送 10 次请求。九、总结将串行请求改造成异步并发往往是批量 API 任务最直接的性能优化方式。但真正可用于生产环境的并发程序不能只写一个asyncio.gather()还需要综合考虑并发数量限制连接复用请求超时自动重试错误隔离服务端限流结果记录与失败补偿。对于 I/O 密集型任务合理使用asyncio和aiohttp可以大幅缩短执行时间。与此同时也要避免盲目提高并发数。稳定、可控、可恢复通常比单纯追求峰值速度更加重要。

相关新闻

CAN总线波形解析:显隐性电平与异常波形诊断

CAN总线波形解析:显隐性电平与异常波形诊断

1. CAN总线波形基础:显性与隐性电平的本质在CAN总线通信中,信号传输的核心载体是差分电压。具体表现为CAN_H和CAN_L两条信号线之间的电位差。这个看似简单的电压差背后,隐藏着CAN总线稳定通信的奥秘。显性电平(Dominant&#xff0…

2026/7/20 23:52:15 阅读更多 →
应对网站IP频率限制:代理IP轮换策略的4种进阶玩法,再也不被封

应对网站IP频率限制:代理IP轮换策略的4种进阶玩法,再也不被封

玩爬虫采集、批量测接口的朋友,应该都被网站IP频率限制坑过吧?好好的数据采集任务,跑没多久就直接翻车:IP被封、弹窗验证码刷屏、请求直接403报错,忙活半天全白费,真的巨影响心态。大多数人解决限流封禁&am…

2026/7/22 23:46:24 阅读更多 →
电子元件分类:主动/被动与有源/无源的区别与应用

电子元件分类:主动/被动与有源/无源的区别与应用

1. 电子元件分类的基本概念在电子工程领域,元件的分类方式多种多样,但最基础也最容易混淆的就是主动/被动、有源/无源、分立/集成这几组概念。我刚入行时也经常搞混这些术语,直到参与了几次完整的电路设计流程后才真正理解它们的区别。主动元…

2026/7/21 11:56:28 阅读更多 →

最新新闻

GLM-5.2 低价冲击:企业开始认真给 Token 算账

GLM-5.2 低价冲击:企业开始认真给 Token 算账

GLM-5.2 把模型竞争拉回成本账,企业将用路由重新分配智能。企业用 AI 的第一阶段,大家关心的是「能不能用」。第二阶段,问题变成「用一次多少钱」。 最近围绕 智谱 GLM-5.2 的讨论,正好踩中了这个切换点。 讨论里最吸引人的不是又…

2026/7/23 17:43:19 阅读更多 →
ARM Cortex-M4低功耗机制:WFI/WFE唤醒原理与PRIMASK中断延迟实战

ARM Cortex-M4低功耗机制:WFI/WFE唤醒原理与PRIMASK中断延迟实战

1. 项目概述:深入ARM Cortex-M4的睡眠与唤醒机制 在嵌入式系统开发,尤其是电池供电或对功耗敏感的设备中,如何让处理器在无事可做时“聪明地”休眠,并在需要时被精准唤醒,是每个开发者必须掌握的核心技能。ARM Cortex-…

2026/7/23 17:43:19 阅读更多 →
2026年漳州角美种植牙,口碑载道的门诊推荐

2026年漳州角美种植牙,口碑载道的门诊推荐

随着口腔健康意识的提升,越来越多的人开始重视牙齿问题,尤其是对于牙齿缺失后的修复,种植牙成为了越来越多人的选择。在漳州角美地区,如何选择一家靠谱且口碑良好的种植牙门诊,成为了许多人的难题。本文将基于最新的行…

2026/7/23 17:43:19 阅读更多 →
MCP架构与Agentic RAG系统:提升动态知识库处理效率

MCP架构与Agentic RAG系统:提升动态知识库处理效率

1. 项目概述:MCP架构下的Agentic RAG系统去年在构建金融问答系统时,我首次尝试将MCP协议与RAG结合,意外发现响应速度提升了47%。这种架构如今已成为处理动态知识库的利器。MCP(Model Context Protocol)本质上是一种上下…

2026/7/23 17:43:19 阅读更多 →
C++引用、左值和右值

C++引用、左值和右值

目录 一,引用 1,函数参数引用传递 2,引用型变量 3,函数返回引用型 二,左值和右值 1,左值和右值 2,常见的左值和右值 (1)变量、字面量 (2&#xff09…

2026/7/23 17:43:19 阅读更多 →
2026年柯基护关节狗狗羊奶粉实测:5款产品横评,专宠专用vs通用款优势在哪?

2026年柯基护关节狗狗羊奶粉实测:5款产品横评,专宠专用vs通用款优势在哪?

2026柯基护关节狗狗羊奶粉实测:5款产品横评,专宠专用vs通用款差距有多大 根据派读宠物行业大数据平台2025年发布的《中国宠物营养消费行为调研》,国内宠物羊奶粉市场规模已达47.2亿元,年增速稳定在18%以上;其中针对特定…

2026/7/23 17:42:17 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻