FastAPI通过Python脚本调用响应慢,cURL/Swagger请求速度正常
问题根因
这个现象是localhost域名解析优先级导致的,绝大多数系统的hosts配置会把localhost同时对应IPv6的::1和IPv4的127.0.0.1,Python的HTTP客户端(httpx/requests)默认会优先尝试解析IPv6地址,而你启动的uvicorn只监听IPv4的0.0.0.0,不接收IPv6请求,客户端等待IPv6连接超时(默认超时刚好是2秒)后才会降级尝试IPv4地址,所以会出现固定2秒左右的延迟。
而curl默认启用「快乐眼球(Happy Eyeballs)」机制,会同时发起IPv4和IPv6的连接请求,哪个先响应就用哪个,所以不会触发超时。
验证方法
你可以直接用127.0.0.1代替localhost调用接口测试,如果延迟消失就可以确认是这个问题:
import httpx r = httpx.get('http://127.0.0.1:8000/') print(r.elapsed)
解决方案
有三种常用方案可选:
- 客户端调用时直接使用
127.0.0.1代替localhost,跳过IPv6解析流程 - 启动uvicorn时同时监听IPv4和IPv6地址,修改启动代码的host参数为
::,同时支持IPv4/IPv6访问:if __name__ == '__main__': uvicorn.run(app, host='::', port=8000) - 修改本地hosts文件,删除
localhost对应的::1映射,强制localhost优先解析为IPv4地址
内容的提问来源于stack exchange,提问作者Johannes Mols
相关产品推荐
相关产品推荐

