dev.to | 📄 原文链接 | 2026-10-14 收录

把 def 改成 async def,一次阻塞调用冻住了整个 FastAPI

来源:dev.to — 2026-10-13

📋 概述

所有写异步 Python 的人都被叮嘱过不要阻塞事件循环,但作者没见过有人测量一次阻塞调用到底造成多大破坏。在他的实验里,同一个 requests.get 在普通的 def 端点里完全无害,在 async def 端点里却冻住了整个服务器:一个平时 1.6 毫秒返回的无关端点,花了 34 秒才应答。环境是 Python 3.14.4 加 FastAPI 0.143.0,用二十个并发客户端压一个慢端点,同时每 50 毫秒探一次那个无关的 /fast 端点。结果是 async def 加 requests 让 /fast 的中位数变成 34130 毫秒、慢请求只服务了 35 个,而其他三种组合都是 1.6 毫秒、服务 320 个——服务器变成了严格串行。原因是 def 端点会被 FastAPI 丢进线程池,而 async def 端点就在跑事件循环的那条线程上阻塞,而线程池的上限是 40 个线程。

🔑 核心要点

💡 金句

这段代码读起来更现代了,行为却像一台只有一个线程的服务器。
← 返回 dev.to 首页