FastAPI async接口配置多worker仍串行处理请求问题排查
问题原因分析
1. Uvicorn配置冲突
你代码中启动Uvicorn时同时设置了reload=True和workers=2,这两个参数是互斥的:只要开启热重载(reload)功能,Uvicorn会强制仅启动1个工作进程,你配置的多worker参数会直接失效,服务实际运行时只有1个进程处理请求。
2. 浏览器请求排队限制
即便多worker配置生效,用同一个浏览器的两个标签页同时请求同一个接口,也会出现串行效果:主流浏览器(Chrome、Edge、Firefox等)默认会对同域名的相同请求做排队限制,避免重复资源占用,会等第一个请求返回后才会发起第二个请求,所以服务端收到的两个请求本身就是先后到达的,自然呈现串行处理的日志。
解决方法
- 调整Uvicorn启动配置,移除
reload=True参数:
if __name__ == "__main__": uvicorn.run("fastapitest.main:app", host="0.0.0.0", port=8000, workers=2)
启动后可查看Uvicorn初始化日志,会输出两个工作进程的启动记录,代表多worker配置生效。
- 更换测试方式,避免浏览器的请求限制:
- 打开两个终端窗口,同时执行
curl http://localhost:8000/delayed - 用两个不同的浏览器(如Chrome+Edge)分别发起请求,或打开两个无痕浏览窗口分别访问
调整后即可看到两条Starting at日志几乎同时打印,符合并行处理的预期。
补充说明
异步接口的并行处理不需要依赖多worker,单进程下的asyncio事件循环也可以在await阻塞时切换处理其他请求。你哪怕只开1个worker,只要请求是同时到达服务端,也会出现并行执行的效果,多worker只是进一步利用多核CPU提升吞吐量而已。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

