在 FastAPI 中,BackgroundTasks 是一个功能,它允许你在发送响应给客户端之后执行后台任务。这些任务对于不需要客户端等待的操作非常有用,比如发送电子邮件通知或处理数据。然而,当服务器重启时,由于 BackgroundTasks 是与单个应用实例的生命周期相关联的,它们不会自动恢复执行。

FastAPI 进阶:使用 BackgroundTasks 处理长时间运行的任务_服务器

BackgroundTasks主要适用于不需要跨服务器或长时间运行的轻量级后台任务。对于更复杂或资源密集型的任务,建议使用专门的任务队列管理系统。

如何使用 BackgroundTasks

  1. 导入和定义:首先,你需要从 fastapi 导入 BackgroundTasks 并在路径操作函数中定义一个参数,类型声明为 BackgroundTasks
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
  1. 创建后台任务函数:创建一个函数作为后台任务,它可以是普通的函数或异步函数。
def write_notification(email: str, message: str = ""):
    with open("notifications.txt", "a") as f:
        f.write(f"Notification for {email}: {message}\n")
  1. 添加后台任务:在路径操作函数中,使用 .add_task() 方法将任务函数添加到后台任务对象中。
@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="test message")
    return {"message": "Notification sent in the background"}

技术细节:

  • BackgroundTasks 类来自 starlette.background,FastAPI 直接将其包含在内,以便你可以直接从 fastapi 导入它。
  • 你可以在路径操作函数、依赖项、子依赖项中等使用 BackgroundTasks
  • FastAPI 会将所有后台任务合并在一起,然后在后台按 add_task 的顺序执行。

注意事项:

  • 如果你需要执行繁重的后台计算,且可能需要多个进程运行(例如,不需要共享内存、变量等),使用其他更大的工具,如 Celery,可能会更好。这些工具需要更复杂的配置、消息/作业队列管理器,如 RabbitMQ 或 Redis,它们允许在多个进程中运行后台任务,尤其是在多个服务器中。
  • 但是,如果你需要从同一个 FastAPI 应用程序访问变量和对象,或者需要执行小型后台任务(例如发送电子邮件通知),只需使用 BackgroundTasks
  • BackgroundTasks 并不持久化任务,如果服务器重启,未完成的任务将会丢失。

通过使用 BackgroundTasks,你可以提高应用程序的响应性和效率,同时确保后台任务不会阻塞主线程。这是一个在构建现代异步 Web 应用程序时非常有用的功能。