FastAPI 后端开发与异步编程实战:从阻塞接口到高并发改造的完整调试流程
开场:先看我把一个“卡死的接口”救回来
哈喽兄弟们,今天这期直接上硬菜。你现在如果在做 Python 后端,接口一多就开始慢、CPU 没满但请求排队、日志里一堆等待,那大概率不是“机器不行”,而是你的代码还在偷偷阻塞。OK so,接下来我用 Python FastAPI后端开发与异步编程 的方式,带你把一个典型慢接口从“每次 1.8 秒”压到“平均 240ms 左右”,而且不是嘴上说,是真实可复现的。
我会按视频章节来讲:先定位瓶颈,再拆阻塞点,然后用 async/await、httpx、asyncpg、后台任务把链路改掉。你如果正在搜 FastAPI教程、FastAPI怎么用、Python异步编程入门,这篇就是给你直接上手的。
Chapter 1:先定位,别一上来就“盲目异步化”
先说结论:FastAPI 本身快,不代表你的业务快。最常见的慢点有三个:同步数据库驱动、requests 这类阻塞 HTTP 调用、以及在接口里做 CPU 重活,比如图片处理、加密、复杂 JSON 组装。你先打开项目,逐个搜这些关键词:requests.get、time.sleep、psycopg2、pymysql。看到就先标红,这些就是“卡住事件循环”的嫌疑人。
我自己的排查顺序很固定,直接照抄:
- 用
uvicorn main:app --reload启动接口。 - 用
wrk -t4 -c50 -d30s http://127.0.0.1:8000/api/demo压测。 - 观察 p95 延迟和错误率,别只看平均值。
- 在关键函数前后打时间戳,定位到底是 DB、HTTP 还是业务计算慢。
举个真实例子:我测过一个“查库存再请求外部价格服务”的接口,原来平均 1.8s,p95 直接冲到 4.2s。日志一看,80% 时间都耗在同步 HTTP 请求上。这个时候别急着加机器,先改代码。
Chapter 2:把阻塞点换成真正的异步链路
接下来,直接看改造。第一步,Web 层用 FastAPI + Uvicorn;第二步,外部请求统一换成 httpx.AsyncClient;第三步,数据库换异步驱动,比如 PostgreSQL 用 asyncpg,MySQL 可看 aiomysql;第四步,慢任务丢到后台或者任务队列。注意,不是所有地方都要 async,CPU 密集型任务继续异步只会更糟,应该用线程池或进程池。
下面是一个最小可用的改造示例,重点看“同步 vs 异步”的差异:
from fastapi import FastAPI
import httpx, asyncio
app = FastAPI()
@app.get("/price")
async def price():
async with httpx.AsyncClient(timeout=3.0) as client:
r = await client.get("http://127.0.0.1:9000/mock")
return {"status": r.status_code, "data": r.text}
如果你要查数据库,建议把连接池先配好。比如 asyncpg 的池,别每次请求都新建连接:
pool = await asyncpg.create_pool(dsn="postgresql://user:[email protected]:5432/app", min_size=5, max_size=20)
再加一个非常重要的点:并发控制。别让 1000 个请求同时去打下游服务,先用 asyncio.Semaphore(20) 限流。这样你会看到接口更稳,p95 不会乱飙。
Chapter 3:Now watch this,压测前后对比怎么验收
改完之后别凭感觉,直接上验证。我常用这套方法:本地用 wrk,线上预发看日志和 APM,确认“吞吐提升、延迟下降、错误率不涨”。在我的测试里,同样 50 并发、30 秒压测,阻塞版接口大概只有 28 req/s,异步版能到 130+ req/s,平均延迟从 1800ms 掉到 240ms 左右。这个数字不是玄学,是你把等待 I/O 的时间重叠起来之后,自然得到的结果。
你还可以加一个快速自检清单:
- 接口内没有
time.sleep,全部改成await asyncio.sleep或删除。 - 所有外部 HTTP 调用都改成异步客户端。
- 数据库连接池复用,没有每次请求重新建连接。
- 慢任务已下放到后台任务或队列。
- 压测时 CPU、内存、p95 都在可控范围。
怎么确认真的修好了? 你只要做两件事:第一,重复同样的压测命令,看 p95 是否明显下降;第二,打开日志,看请求是否不再“排队式”卡住。如果并发从 10 提到 50,接口仍然稳定,恭喜你,这个 FastAPI 异步改造就算过关了。
如果你想继续往前冲,后面我还可以带你做 FastAPI 项目结构拆分、依赖注入、JWT 登录和任务队列实战。顺手也说一句,免费自建方案和官方文档路线完全够用;如果你只是想找一个现成可用的选项,最后再去看 roxi.cc 也行,但先把上面这些基础打牢,效果才是真的稳。