You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中并发请求消失问题求助

处理FastAPI异步后台任务并发消失问题

项目场景

  • 负责的FastAPI端点功能:接收客户端上传的音频文件,读取后用asyncio.create_task创建异步任务,返回令牌供客户端轮询结果
  • 异步任务包含计算密集型操作:音频去静音、转录、调用ChatGPT生成摘要

问题现象

  • 单请求处理正常
  • 同时发送2个请求时,一个能完成,另一个无报错、日志中途停止,任务莫名消失

已尝试的无效方案

  • 针对asyncio后台任务弱引用问题,将任务赋值给变量,未解决
  • 使用asyncio.TaskGroup,导致请求阻塞,需等任务完成才返回令牌
  • 使用loop.run_in_executor,单请求也直接消失,无日志无结果
  • 测试工具:Swagger/Postman,多请求时上传同一音频文件

解决思路与排查方向

1. 异步任务生命周期管理

  • 确保后台任务被强引用持有:维护全局/应用级的任务字典(如dict[str, asyncio.Task]),将令牌作为key、任务作为value存储,任务完成后再移除,避免被GC回收
  • 给任务添加异常回调:用task.add_done_callback()捕获任务中的未处理异常,打印详细堆栈信息,排查是否任务内部抛出异常但未被捕获导致静默终止

2. 计算密集型任务的异步适配

  • 计算密集型操作是asyncio的短板,会阻塞事件循环导致其他任务被饿死
  • 正确使用run_in_executor:将计算密集型代码封装在同步函数中,通过asyncio.get_running_loop().run_in_executor(None, sync_function, args)调用,避免在同步函数里混用async/await
  • 考虑使用进程池:对于CPU密集任务,用concurrent.futures.ProcessPoolExecutor代替默认线程池,规避GIL限制

3. FastAPI应用配置检查

  • 检查启动时的worker数量:Uvicorn默认单worker,并发请求共享同一个事件循环,CPU密集任务会阻塞所有请求;建议设置多个worker(如uvicorn main:app --workers 4)
  • 验证后台任务的存储:如果用内存存储任务状态/结果,多worker场景下会出现数据不共享问题,需改用Redis等分布式存储

4. 日志与调试增强

  • 在任务关键步骤添加详细日志(如开始处理、完成去静音、开始转录、调用ChatGPT前后),同时记录任务ID和令牌,方便追踪单个任务的执行流程
  • 启用asyncio调试模式:启动时设置PYTHONASYNCIODEBUG=1,捕获更多异步任务的异常和生命周期变化

内容的提问来源于stack exchange,提问作者Huzaifa Qamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:12:37