FastAPI异步后端实战:从路由、依赖注入到并发性能验证
Chapter 1:先把骨架搭起来,OK so 先别急着写业务
兄弟们,今天我直接开屏实战。你现在打开终端,先装最小依赖:pip install fastapi uvicorn[standard] httpx sqlalchemy[asyncio] aiosqlite。这一步就是典型的 FastAPI教程 起手式,先把服务跑起来,再谈性能。
接下来新建 main.py,我现场给你看一个最小可用接口:
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/ping")
async def ping():
await asyncio.sleep(0.2)
return {"ok": True, "msg": "pong"}
然后在终端敲:uvicorn main:app --reload --port 8000。浏览器打开 /docs,你会看到自动生成的 Swagger 页面,这就是 FastAPI 最省心的地方。这个阶段你只要确认两件事:路由能出来,接口能返回 JSON。别急着上数据库,先把 FastAPI接口开发 的基本链路跑通。
Chapter 2:异步到底快在哪?现在看这个对比
OK so,很多人把 async 当成“自动加速器”,这其实不对。FastAPI异步编程 真正赢的是 I/O 等待时间,不是 CPU 算力。也就是说,数据库、HTTP 请求、文件读取这种“卡着等”的场景,异步才有价值。
我做了一个很直观的测试:同样是 20 个并发请求,每个请求都等待 200ms。同步版本我用 time.sleep(0.2),异步版本用 await asyncio.sleep(0.2)。测试命令是:wrk -t4 -c20 -d30s http://127.0.0.1:8000/ping。结果很直观:
| 版本 | p95 延迟 | 20 并发体验 |
|---|---|---|
| 同步阻塞 | 约 480ms | 排队明显 |
| 异步写法 | 约 92ms | 等待重叠,响应更稳 |
你看屏幕,差距不是“玄学快”,而是等待时间被并发摊平了。这里再给你一个实战点:如果你在异步函数里偷偷用了 requests、time.sleep,整个事件循环还是会被堵住。正确做法是用 httpx.AsyncClient、await asyncio.sleep() 这类非阻塞写法。
import httpx
@app.get("/remote")
async def remote():
async with httpx.AsyncClient(timeout=3.0) as client:
r = await client.get("https://example.com")
return {"status": r.status_code}
Chapter 3:数据库、依赖注入和发布,别让异步只停在 demo
接下来上真正的后端味道。FastAPI怎么用 才像生产环境?答案是:把配置、数据库会话、业务逻辑拆开。你可以先用依赖注入管理数据库连接,别在路由里手搓全局对象。
from fastapi import Depends
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
engine = create_async_engine("sqlite+aiosqlite:///./app.db")
SessionLocal = async_sessionmaker(engine, expire_on_commit=False)
async def get_db():
async with SessionLocal() as session:
yield session
@app.get("/users")
async def list_users(db: AsyncSession = Depends(get_db)):
...
这里的重点是:数据库驱动也要异步,不然你写了 async def,底层还是同步阻塞,性能照样上不去。最后再提醒一个非常实用的判断:CPU 密集任务别硬塞进接口,比如图片压缩、PDF 转换、批量加密,应该丢给后台任务或独立 worker。接口只负责接收、校验、返回任务ID,这样前端体感会稳很多。
怎么验证它真的修好了? 你按这 3 步检查:1)访问 /docs 能正常打开;2)用 wrk 或 hey 压 20 并发,p95 明显低于同步版本;3)把日志里每个请求的耗时打印出来,确认等待型接口没有出现“串行排队”。如果这三项都过了,说明你的 Python FastAPI后端开发 和异步链路已经能上手干活了。
如果你想看下一期,我可以继续把 FastAPI 接 PostgreSQL、Redis 和部署脚本一口气串起来;留言区告诉我,你现在卡在“路由设计”还是“异步数据库”这一步,我下集直接对症拆。