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

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

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

如何使用 BackgroundTasks

  1. 导入和定义:首先,你需要从 fastapi 导入 BackgroundTasks 并在路径操作函数中定义一个参数,类型声明为 BackgroundTasks

    from fastapi import BackgroundTasks, FastAPI
    app = FastAPI()
    
  2. 创建后台任务函数:创建一个函数作为后台任务,它可以是普通的函数或异步函数。

    def write_notification(email: str, message: str = ""):
        with open("notifications.txt", "a") as f:
            f.write(f"Notification for {email}: {message}\n")
    
  3. 添加后台任务:在路径操作函数中,使用 .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 应用程序时非常有用的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值