FastAPI中使用requests.Session调用本地接口未提速的优化咨询
问题根源
你的核心问题有两个:
- 同步HTTP库阻塞异步事件循环:
requests是同步库,在FastAPI的异步函数中调用会阻塞整个事件循环,导致请求处理效率极低,响应时间被拉长。 - 多Worker下的连接复用失效:你启动了5个uvicorn Worker,每个Worker是独立的进程,各自持有一个
Session实例。每个Worker首次调用时都需要重新建立TCP连接(包含三次握手等耗时操作),而请求会被负载均衡到不同Worker,导致每次API调用都可能触发新的连接建立,所以每次响应都慢。而Jupyter是单进程环境,Session能稳定复用连接,因此后续调用速度快。
解决方案与代码改进
改用异步HTTP客户端(如httpx.AsyncClient)替代requests,它天生支持异步操作,不会阻塞事件循环,同时自带连接池机制,能有效复用连接。此外,通过FastAPI的生命周期事件管理客户端实例,确保每个Worker的连接池正确初始化和复用。
改进后的完整代码
from uvicorn import run as uvicorn_run from fastapi import FastAPI, Request import httpx app = FastAPI() # 定义全局异步客户端变量 async_client: httpx.AsyncClient = None @app.on_event("startup") async def startup_event(): global async_client # 初始化异步客户端,启用连接池 async_client = httpx.AsyncClient( base_url="http://localhost:5005", timeout=httpx.Timeout(5.0) # 设置超时时间,避免无限等待 ) @app.on_event("shutdown") async def shutdown_event(): await async_client.aclose() async def get_text(text): try: response = await async_client.post( "/webhooks/rest/webhook", json={"message": text} ) response.raise_for_status() # 主动抛出HTTP错误 return response.json()[0] except httpx.HTTPError: # 捕获所有HTTP相关错误,返回None或自定义错误信息 return None @app.post('/') async def main(info: Request): text = await info.json() message = text.get('message') response = await get_text(message) return response if __name__ == '__main__': uvicorn_run("file_name:app", host="0.0.0.0", port=8080, reload=True, workers=5)
关键改进点说明
- 替换为异步客户端:
httpx.AsyncClient是异步HTTP库,完全适配FastAPI的异步环境,不会阻塞事件循环,大幅提升并发处理能力。 - 连接池复用:通过
startup事件初始化客户端,每个Worker会创建自己的客户端实例,连接池会自动复用TCP连接,避免每次请求都重新握手。 - 错误处理优化:添加
response.raise_for_status()主动捕获HTTP错误,并用try-except统一处理异常,避免因下游服务错误导致API崩溃。 - 修复原代码错误:原代码中
await r.json()[0]是错误用法(requests的json()是同步方法,不能加await),改用httpx后,response.json()是异步方法,需配合await使用。
额外优化建议
- 调整Worker数量:如果下游服务(localhost:5005)的并发能力有限,过多的Worker可能导致连接数过载,可根据实际情况减少Worker数量(比如改为2-3个)。
- 启用HTTP/2:如果下游服务支持HTTP/2,可在初始化
AsyncClient时添加http2=True,进一步提升连接复用效率。 - 添加日志:在
get_text函数中添加日志,记录请求耗时、响应状态码等信息,方便排查性能瓶颈。
内容的提问来源于stack exchange,提问作者Abdul Quddus
相关产品推荐
相关产品推荐

