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

FastAPI中async def与def选用及阻塞调用测试方法咨询

问题1:FastAPI中的正确处理流程

三个方案中最优选择是方案3:根据底层调用逻辑混合搭配def与async def,各方案的优劣说明如下:

  • 方案1(全def定义):可用但性能上限低。FastAPI确实会自动将所有def定义的端点函数扔到独立线程池执行,不会阻塞事件循环,但如果你的部分端点逻辑可使用异步IO(如异步数据库、异步HTTP请求),全def写法会浪费异步的性能优势,并发上限受限于线程池大小,高并发场景下性能弱于混合写法。
  • 方案2(全async def+手动调用executor):可用但冗余且风险高。你手动调用loop.run_in_executor的逻辑其实是FastAPI处理def端点时自动完成的操作,额外增加了代码量;如果后续维护时忘了把同步阻塞代码扔进executor,直接在async def中调用的话,会直接卡住整个服务的事件循环,导致所有请求都无法响应。
  • 方案3(混合搭配):官方推荐的最佳实践,规则非常简单:
    1. 端点逻辑以同步阻塞代码为主(如调用同步计算函数、同步数据库驱动),直接用def定义即可
    2. 端点逻辑包含可await的异步操作(如异步IO请求、异步数据库查询),就用async def定义

问题2:阻塞判断方法与压力测试工具

阻塞判断方法

无需复杂工具,写一个极简的异步测试端点即可验证:

@app.get("/ping")
async def ping():
    return {"status": "ok"}

测试逻辑:在触发你要验证的长耗时端点的同时,以高频率发送请求到/ping接口:

  • 如果/ping的响应始终在毫秒级,说明长耗时端点没有阻塞主事件循环
  • 如果/ping的响应时间突然变长甚至超时,说明长耗时端点的逻辑卡住了事件循环

压力测试工具

不需要专门的FastAPI/uvicorn扩展,通用的性能测试工具都可以使用:

  • 轻量快速测试:可使用wrk、ab(Apache Bench)命令行工具,一行命令即可测并发下的QPS、延迟分布
  • 自定义复杂场景:可使用locust编写Python脚本模拟自定义请求逻辑,也可以用httpx.AsyncClient写并发测试脚本集成到pytest测试用例中

内容的提问来源于stack exchange,提问作者Napoleon Borntoparty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:05