python中频繁调用外部api导致性能低下时,应使用asyncio异步方案:一、asyncio.gather并发请求;二、create_task动态调度;三、semaphore限流;四、wait处理超时;五、tcpconnector优化连接池。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在 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 延长空闲连接存活时间,减少重复建连成本。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










