You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中使用requests.Session调用本地接口未提速的优化咨询

问题根源

你的核心问题有两个:

  1. 同步HTTP库阻塞异步事件循环:requests是同步库,在FastAPI的异步函数中调用会阻塞整个事件循环,导致请求处理效率极低,响应时间被拉长。
  2. 多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:40:50