FastAPI后台任务在Azure函数应用中无法正常运行的问题咨询
问题
按照FastAPI官方文档的方式在Azure函数应用中添加后台任务,代码如下:
async def background_task(): logging.info("Background task started") await asyncio.sleep(5) logging.info("Background task finished") @app.get("/do_background_task") async def do_background_task(background_tasks: BackgroundTasks): background_tasks.add_task(background_task) return {"message": "Background task started, this response should return immediately."}
但实际运行不符合预期,响应需要等待5秒才返回。本地运行及Azure部署均出现该问题,请问这是Azure Functions的限制还是操作有误?
原因与解决办法
这是因为Azure Functions的Python宿主环境会等待当前请求上下文的所有异步任务完成后才会结束请求。FastAPI的BackgroundTasks本质是在请求响应后的同一事件循环中执行任务,但在Azure Functions的环境下,这个事件循环会被宿主阻塞直到所有任务完成,直接导致了响应延迟。
你可以通过以下两种方式解决:
- 使用Azure Functions原生的Durable Functions或者队列触发器实现后台任务逻辑:将耗时任务放入队列,由单独的函数实例处理,主请求可以立即返回。
- 手动创建独立的异步线程执行后台任务,绕过Azure Functions的请求上下文阻塞,修改后的示例代码如下:
import threading import asyncio import logging async def background_task(): logging.info("Background task started") await asyncio.sleep(5) logging.info("Background task finished") def run_async_task(task): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(task) loop.close() @app.get("/do_background_task") async def do_background_task(): threading.Thread(target=run_async_task, args=(background_task(),)).start() return {"message": "Background task started, this response should return immediately."}
注意:使用线程方式需要做好异常处理和资源回收,避免内存泄漏。
内容的提问来源于stack exchange,提问作者warreee
相关产品推荐
相关产品推荐

