locust调用fastapi需用同步requests客户端,task函数不可用async/await;jwt认证通过headers传递;422错误需catch_response=true手动标记success;fastapi必须关闭debug和reload;依赖与中间件须异步且并发安全。

Locust 脚本里怎么写 FastAPI 接口调用
FastAPI 默认走异步,但 Locust(截至 2.15 版)的 HttpUser 底层用的是同步 HTTP 客户端(requests),直接发请求没问题,但别误以为能自动用上 async def —— Locust 的 task 函数必须是同步的。
常见错误现象:RuntimeWarning: coroutine 'AsyncSession.request' was never awaited,说明你写了 await client.get(...),但 Locust 不支持。
- 用
self.client.get("/items"),不是await self.client.get(...) - 如果 FastAPI 接口带 JWT,把 token 放进
headers:self.client.get("/protected", headers={"Authorization": "Bearer xxx"}) - 路径带变量?拼 URL 就行:
f"/users/{user_id}",Locust 不解析 FastAPI 的路径参数语法 - POST 提交 JSON?用
json=...参数:self.client.post("/items", json={"name": "test"})
怎么让 Locust 正确识别 FastAPI 的 422 错误
FastAPI 对请求体校验失败默认返回 422 Unprocessable Entity,而 Locust 默认只把 2xx 和 3xx 当成功。结果就是——大量请求标成“failure”,但你其实想测的是业务逻辑瓶颈,不是 Pydantic 校验速度。
- 在请求后加
catch_response=True,手动标记成功:with self.client.get("/items", catch_response=True) as response: if response.status_code == 422: response.success() - 更稳妥的做法:提前校验数据格式,避免压测时反复触发 422;真要保留,就用上面方式“吞掉”它
- 注意
response.success()不会改变响应时间统计,但会影响成功率曲线和 failure tab 显示
FastAPI 启动时要不要关掉 debug=True
必须关。Locust 压测下 debug=True 会让 FastAPI 加载额外中间件(比如重载器、调试面板),不仅拖慢单请求耗时,还可能引发 RuntimeError: asyncio.run() cannot be called from a running event loop —— 尤其在 Locust worker 模式下。
- 启动命令改用:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload=False --workers 4 -
--workers数建议 ≤ CPU 核数 × 2;设太高反而因上下文切换增加延迟 - 确保环境变量
DEBUG=False或代码里显式传参:app = FastAPI(debug=False) - 检查日志里有没有
INFO: Uvicorn running on http://...之后还出现INFO: Watching for file changes with StatReload—— 有就说明 reload 没关干净
压测结果不准?先查 FastAPI 的中间件和依赖注入
FastAPI 的 Depends(比如数据库连接池、Redis 客户端)如果没做并发安全设计,会在 Locust 高并发下暴露资源争抢问题;某些自定义中间件(如日志、鉴权)也可能同步阻塞事件循环。
- 避免在依赖中做耗时同步操作:比如用
requests.get调第三方 API,应换成httpx.AsyncClient - 数据库连接池大小要匹配 Locust 并发数:比如
asyncpg的min_size=10, max_size=50,对应 Locust 设置users=50 - 临时禁用非核心中间件测试:注释掉
app.add_middleware(...)看 RPS 是否明显上升 - 用
uvicorn --log-level warning关掉 access log,减少 I/O 干扰
真实压测里最常被忽略的,是 FastAPI 路由函数里混用了同步和异步调用——比如 time.sleep(1) 卡住整个 event loop,这时候 Locust 显示的不是 QPS 下降,而是所有用户卡在同一个协程里等唤醒。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











