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
相关产品推荐
相关产品推荐

