aiohttp 和 httpx 的异步客户端,选型看这四点

举报
yd_275379215 发表于 2026/11/03 11:55:05 2026/11/03
【摘要】 两个都能写async客户端,差异藏在工程细节里,我们选型时列了四条硬指标。第一,API范围:httpx同步异步双API,requests风格上手零成本,同一份调用代码在脚本里同步跑、在服务里异步跑;aiohttp只有异步,但客户端、服务端、websocket一体。第二,HTTP/2:httpx装httpx[http2]即开,对同一域名的高频调用,多路复用收益实测降延迟15%;aiohttp至...

两个都能写 async 客户端,差异藏在工程细节里,我们选型时列了四条硬指标。

第一,API 范围:httpx 同步异步双 API,requests 风格上手零成本,同一份调用代码在脚本里同步跑、在服务里异步跑;aiohttp 只有异步,但客户端、服务端、websocket 一体。第二,HTTP/2:httpx 装 httpx[http2] 即开,对同一域名的高频调用,多路复用收益实测降延迟 15%;aiohttp 至今不支持。第三,生态:httpx 的 mock 测试工具成熟,openai 等 SDK 底层都是它;aiohttp 胜在轻量,纯异步极限吞吐略高。第四,超时语义:httpx 默认 connect、read、write、pool 四段各 5 秒,粒度清晰;aiohttp 默认总超时 300 秒,生产必须显式收紧,这是个隐形炸弹。

我们的落地代码:

import httpx

# 应用级单例,连接池才有效
client = httpx.AsyncClient(
    timeout=httpx.Timeout(connect=1.0, read=3.0, pool=2.0),
    limits=httpx.Limits(max_connections=100,
                        max_keepalive_connections=20),
    http2=True,
)

async def call_payment(order_id: str):
    r = await client.get(f"https://pay.internal/orders/{order_id}")
    r.raise_for_status()
    return r.json()

最容易犯的错是每请求新建 AsyncClient:连接池形同虚设,TLS 握手翻倍,压测时本机 TIME_WAIT 飙升。客户端要在应用启动时创建、关闭时 aclose(),FastAPI 里挂进 lifespan。

最终结论:内部调用密集、要 HTTP/2、要双 API 降测试成本,选 httpx;只要一个轻的异步全家桶,aiohttp 依然成立。选型分歧少的团队,两条硬指标就能定。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。