首页 / 后端开发 / FastAPI异步接口实战:从阻塞到

FastAPI异步接口实战:从阻塞到高并发,现场压测给你看

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

第1章:OK so,先把“假异步”揪出来

85%转化提升2.5s响应速度100+功能模块365天持续更新

兄弟们开机!这里是 eccfy,今天我们不讲概念 PPT,直接盯着终端干活。很多人搜“FastAPI异步编程教程”,结果代码里写了 async def,里面却塞了同步数据库查询、同步 HTTP 请求,表面异步,实际全场堵车。

接下来我先搭一个最小项目。屏幕左边是 VS Code,右边是终端,跟着敲:

mkdir fastapi-async-demo && cd fastapi-async-demo
python -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn httpx asyncpg sqlalchemy pytest pytest-asyncio

创建 main.py:

from fastapi import FastAPI
import time, asyncio, httpx

app = FastAPI()

@app.get("/bad")
async def bad():
    time.sleep(1)
    return {"ok": True}

@app.get("/good")
async def good():
    await asyncio.sleep(1)
    return {"ok": True}

启动:uvicorn main:app --reload --port 8000。注意看,/bad 里面的 time.sleep 会阻塞事件循环,/good 才是真正让出执行权。这就是“FastAPI后端开发怎么用”里最容易踩的坑。

第2章:Now watch this,压测前后差距直接亮出来

性价比88易用性82稳定性95安全性90客服75

接下来上工具,我用 wrk 做现场测试。没有 wrk 的同学也可以用 hey,工具名写在这,自己装就行。我的测试环境是 MacBook M2,16GB 内存,本地回环网络。

分别压测 30 秒,100 并发:

wrk -t4 -c100 -d30s http://127.0.0.1:8000/bad
wrk -t4 -c100 -d30s http://127.0.0.1:8000/good

我这边实测结果:/bad 大约 1.0 req/s,平均延迟接近 1 秒以上;/good 大约 95-100 req/s,平均延迟约 1.02 秒。看到了吗?单个请求都等 1 秒,但异步版本能同时挂起 100 个请求,这就是吞吐差异。

如果你接口慢,别第一反应怀疑网络、免费VPN、翻墙软件或者“油管怎么看”那类环境问题。后端内部阻塞更常见:同步 ORM、同步 requests、CPU 密集计算、文件大读写,都会把事件循环卡住。

第3章:接下来改真实接口:HTTP、数据库、验证三件套

先看外部 HTTP 调用,别用同步 requests,改成 httpx.AsyncClient:

@app.get("/fetch")
async def fetch():
    async with httpx.AsyncClient(timeout=5) as client:
        r = await client.get("http://127.0.0.1:8000/good")
    return {"status": r.status_code}

数据库也一样。PostgreSQL 推荐 asyncpg 或 SQLAlchemy async engine。连接池别乱开,我一般先从 pool_size=5、max_overflow=10 开始,然后用压测看连接等待时间。

from sqlalchemy.ext.asyncio import create_async_engine

engine = create_async_engine(
  "postgresql+asyncpg://user:[email protected]:5432/app",
  pool_size=5,
  max_overflow=10,
  pool_pre_ping=True
)

上线前我会固定做三步验证:

  1. 用 wrk -t4 -c100 -d60s 对核心接口压测,记录 RPS、P95、错误率。
  2. 打开日志,确认没有 RuntimeWarning: coroutine was never awaited。
  3. 在接口里临时加时间戳,确认慢点出现在数据库、外部接口还是业务计算。

怎么验证修好了?同样并发下,错误率应为 0,P95 延迟下降或吞吐明显上升;如果 /bad 到 /good 这种场景,吞吐从约 1 req/s 到约 100 req/s,就说明异步改造生效。

免费路线优先:官方文档、内置 asyncio、本地压测工具已经够你排掉 80% 问题;如果你还需要稳定访问海外开发文档或包源,Roxi 这类工具可作为选项之一:https://wizzegroup.com。记得一键三连,下一期我现场拆 FastAPI 鉴权和限流!