Python开发者必看:asyncio提升API并发效率技巧
时间:2026-04-01 16:57:23 247浏览 收藏
Python开发者若正被频繁调用外部API导致的响应慢、资源浪费和I/O阻塞困扰,这篇干货指南将带你用asyncio彻底破局:从并发请求(gather)、动态任务调度(create_task)、智能限流(Semaphore)、超时可控(wait)到连接池深度优化(TCPConnector),五招环环相扣,助你轻松实现高吞吐、低延迟、稳可靠的异步API调用——性能提升不止一倍,而是重构整个I/O密集型应用的效率基线。

如果您在 Python 中频繁调用外部 API,发现同步请求导致整体执行缓慢、响应延迟高、资源利用率低,则很可能是 I/O 等待阻塞了主线程。asyncio 提供了基于事件循环的异步编程模型,可显著提升并发调用效率。以下是实现该目标的多种方法:
一、使用 asyncio.gather 并发发起多个 API 请求
asyncio.gather 用于并发执行多个协程,并等待全部完成,适用于已知数量且彼此独立的 API 调用任务,能最小化总耗时。
1、导入 aiohttp 和 asyncio 模块:import asyncio, aiohttp。
2、定义异步请求函数,使用 aiohttp.ClientSession 发起 GET 请求,并返回响应 JSON 数据。
3、在主协程中构造多个请求协程对象列表,例如 [fetch(session, url) for url in urls]。
4、调用 await asyncio.gather(*coro_list) 并发执行全部请求。
二、使用 asyncio.create_task 显式调度协程任务
create_task 将协程包装为 Task 对象并立即调度执行,适用于需动态添加任务、或需在运行中控制任务生命周期的场景。
1、在事件循环内创建 ClientSession 实例。
2、对每个 URL 调用 asyncio.create_task(fetch(session, url)) 生成并启动任务。
3、将所有 Task 对象存入列表,再使用 await asyncio.gather(*tasks) 统一等待结果。
4、注意避免在循环外提前 await 单个 task,否则将退化为串行执行。
三、使用 asyncio.Semaphore 控制并发请求数量
当目标 API 存在速率限制或服务端承受能力有限时,无节制并发可能触发 429 错误或连接拒绝,Semaphore 可强制限制同时进行的请求数。
1、初始化信号量对象:sem = asyncio.Semaphore(5),表示最多 5 个并发请求。
2、在 fetch 函数内部使用 async with sem: 包裹实际请求逻辑。
3、确保所有请求均通过同一 Semaphore 实例协调,否则限流无效。
4、该机制不影响总请求数,仅调节瞬时并发压力。
四、使用 asyncio.wait 区分完成与超时任务
asyncio.wait 允许设定超时阈值,并分别获取已完成与未完成的任务集合,适用于对响应时效敏感、需快速失败并继续处理其余请求的场景。
1、将所有请求协程封装为 Task 列表。
2、调用 done, pending = await asyncio.wait(tasks, timeout=3.0)。
3、遍历 done 集合,用 result() 获取成功响应;对 pending 中剩余任务调用 cancel() 主动终止。
4、取消后需 await 每个 pending 任务以清理状态,防止警告。
五、结合 aiohttp.TCPConnector 复用连接与调整连接池
aiohttp 默认复用 TCP 连接,但连接池大小、超时参数等若未显式配置,可能成为性能瓶颈。合理设置连接器可减少握手开销并提升吞吐。
1、创建 connector 实例:connector = aiohttp.TCPConnector(limit=100, limit_per_host=30, keepalive_timeout=30)。
2、将 connector 传入 ClientSession 构造函数:session = aiohttp.ClientSession(connector=connector)。
3、limit 控制全局最大连接数,limit_per_host 限制单域名并发连接数,避免被远端限流。
4、keepalive_timeout 延长空闲连接存活时间,减少重复建连成本。
以上就是《Python开发者必看:asyncio提升API并发效率技巧》的详细内容,更多关于的资料请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
140 收藏
-
279 收藏
-
410 收藏
-
131 收藏
-
196 收藏
-
455 收藏
-
380 收藏
-
402 收藏
-
393 收藏
-
201 收藏
-
411 收藏
-
227 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习