FastAPI同步模式下为何能同时处理多个请求?
为什么同步FastAPI接口的第二个请求会先启动?
你的root函数是同步函数(未用async定义),FastAPI搭配Uvicorn时,会把这类同步路由函数放到线程池中执行,而不是让它们阻塞事件循环的主线程。
具体过程是这样的:
- 第一个请求进来,Uvicorn从线程池分配一个线程执行
root,这个线程执行到time.sleep(30)时进入阻塞状态,但线程池还有其他空闲线程; - 第二个请求短时间内到达,Uvicorn直接分配另一个空闲线程处理它,所以第二个请求的
Started at日志会先打印出来,此时第一个线程还在sleep; - 等第一个线程的30秒sleep结束,才会打印它的
Executed at并返回响应; - 之后第二个线程的sleep结束,打印自己的
Executed at并返回响应。
对应你给出的日志时间线:
- 第一个请求23:40:53启动,sleep30秒后在23:41:23执行完成,和日志完全匹配;
- 第二个请求23:41:16启动,sleep30秒后在23:41:47执行完成,也符合时间逻辑。
内容的提问来源于stack exchange,提问作者StuffHappens
相关产品推荐
相关产品推荐

