FastAPI异步与同步工作机制差异及测试疑问解答
FastAPI同步与异步的核心差异解析
一、你的同步应用为什么没出现串行等待?
FastAPI默认搭配的服务器(比如Uvicorn)对同步路由(用def定义的接口)会采用线程池来处理请求:
- 当你发送第一个
n=10的请求时,服务器会分配一个线程执行time.sleep(10),这个线程会进入阻塞状态,但线程池里还有其他空闲线程。 - 后续两个
n=1的请求会被分配到其他空闲线程,各自独立执行time.sleep(1),完全不用等第一个请求的10秒结束。所以最后一个请求的耗时自然只有1秒左右,和你预期的串行完全不同。
简单说:同步路由的阻塞操作只会占住单个线程,线程池的多线程让多请求能并行处理。
二、异步应用什么时候会出现串行?
异步路由(用async def定义的接口)是在事件循环中执行的,正常情况下它的并发逻辑是这样的:
- 如果你的接口用
asyncio.sleep(n),这是个非阻塞的休眠操作——事件循环会暂时挂起当前请求的任务,转而去处理其他等待的请求,等休眠时间到了再回来继续执行。这种情况下,多个请求是并发处理的,不会串行。 - 但如果你的异步接口里误用了
time.sleep(n)这类同步阻塞操作,事件循环会被彻底卡住,没法切换到其他任务。这时候所有后续请求都得等这个阻塞操作完成才能处理,就会出现你以为的“串行等待”。
三、同步与异步的核心差异
- 执行机制:同步路由靠线程池的多线程并行,异步路由靠单/少线程的事件循环并发。
- 阻塞影响:同步路由的阻塞只会占用单个线程,不影响其他请求;异步路由里的同步阻塞会卡死整个事件循环,导致所有请求排队。
- 适用场景:同步适合CPU密集型任务、没有异步库支持的场景;异步适合IO密集型任务(比如调用第三方API、数据库查询),能极大提升并发量。
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

