FastAPI接口阻塞多并行请求 客户端请求排队延迟问题咨询
问题根因
工作进程数配置过低
你当前的Gunicorn启动配置中-w 1参数指定了仅启动1个工作进程,单进程同一时间只能处理1个请求,后续请求会进入TCP监听队列等待前序请求处理完成,自然出现串行排队的现象。两个请求各需要20-25秒处理时间,叠加后第二个请求总耗时接近1分钟属于符合预期的表现。
这个问题属于Python Web服务部署的常见问题,大量首次部署CPU密集型接口的开发者都遇到过相同的排队现象,核心是对Gunicorn的Worker调度模型、Python GIL特性不熟悉导致的配置不合理。Worker类型与业务场景不匹配
你使用的uvicorn.workers.UvicornWorker属于异步协程Worker,仅适合IO密集型场景(如大量数据库查询、第三方接口调用等存在IO等待的业务)。而你的接口是CPU密集计算场景,受Python全局解释器锁(GIL)限制,单进程内同一时间只能有1个CPU计算任务执行,完全无法发挥异步Worker的并发优势,反而会带来额外的协程调度开销。
优化方案
- 调整工作进程数:Gunicorn官方针对CPU密集型场景的推荐配置为
工作进程数 = CPU核心数 * 2 + 1,例如部署服务器为4核CPU时,可将启动参数中的-w 1修改为-w 9,即可同时处理多个CPU计算请求,避免排队。 - 替换Worker类型:如果你的接口没有大量IO等待逻辑,可删除
-k uvicorn.workers.UvicornWorker参数,使用默认的sync同步Worker处理CPU密集任务,调度开销更低。 - 进阶优化:如果单请求计算量极大,可在接口逻辑内部使用
concurrent.futures.ProcessPoolExecutor多进程池拆分计算任务,进一步降低单请求处理耗时。
内容的提问来源于stack exchange,提问作者user_12
相关产品推荐
相关产品推荐

