首页 > 其他分享 >FastAPI 进阶:使用 BackgroundTasks 处理长时间运行的任务

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

时间:2024-09-09 18:53:32浏览次数:13  
标签:进阶 FastAPI message BackgroundTasks 后台任务 email 函数

在 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 应用程序时非常有用的功能。

标签:进阶,FastAPI,message,BackgroundTasks,后台任务,email,函数
From: https://blog.51cto.com/u_17005223/11962598

相关文章

  • FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑
    在FastAPI框架中,Depends是一个关键的功能,它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用,因为它可以将这些逻辑抽象化,从而减少冗余代码并提高效率。通过Depends,我们可以定义一个函数,该函数负责获取和验证分页参数(如skip和limit)以及过滤参数(如基......
  • 20240904_192638 mysql 填空题 存储过程进阶
    定义一个存储过程的形参,它接收数据,参数名为id,为int类型inidint定义一个存储过程的形参,它返回数据,参数名为name,是varchar(5)类型outnamevarchar(5)定义一个存储过程的形参,它一边接收数据一边返回数据,参数名为num,是int类型inoutnumint声明一个名为info的游标,保存查询teac......
  • redis订阅者和进阶
    Redis进阶redis订阅者模式简介redis存在订阅者模式。就像是一个广播系统。存在三种角色:订阅者、发布者、频道。在redis当中,它们表示为subscriber(订阅者)、publisher(发布者)、channel(频道)其中的行为大抵是:订阅者订阅频道-->发布者针对于特定频道发布信息-->特定订阅者......
  • C++ 模板进阶知识——stdenable_if
    目录C++模板进阶知识——std::enable_if1.简介和背景基本语法使用场景2.`std::enable_if`的基本用法示例:限制函数模板只接受整数类型3.SFINAE和std::enable_if示例:使用SFINAE进行函数重载SFINAE的优点应用场景4.在类模板中使用std::enable_if示例:根据类型......
  • 【408DS算法题】038进阶-图深度优先遍历DFS
    Index题目分析实现总结题目设计函数实现对图的深度优先遍历。分析实现类似于图的BFS的分析思路,图的DFS和二叉树的DFS思路相同,但需要额外考虑结点是否已经被访问过。此处同样用布尔数组visited来记录每个结点的访问情况,对于邻接矩阵存储方式的图的DFS,依照先序遍......
  • [MySQL表的增删改查-进阶]
    ......
  • FastAPI模块化:为复杂应用程序提供清晰的结构
    开题描述:在现代软件开发中,随着应用程序规模的扩大和功能的增加,传统的单体架构逐渐暴露出其局限性。FastAPI,作为一款高性能的现代Web框架,通过其模块化设计提供了一种解决方案。本文将探讨FastAPI模块化如何为构建复杂应用程序提供清晰的结构,从而提高代码的可维护性、可扩展性和团队......
  • Go进阶概览 -【2.2 结构体与方法集的实现】
    2.2结构体与方法集的实现结构体是我们在实际运用中使用比较多的一个概念,Go语言封装的比较简单,我们在使用的时候不需要关注太多的东西。但是如果对于性能有要求、需要开发框架时,我们还是需要对结构体进行一个深入的了解。本节我们将针对结构体的内存布局、接口实现及面向......
  • Go进阶概览 -【2.4 切片的结构与内存管理】
    2.4切片的结构与内存管理切片是我们日常使用比较多的一个结构,深入的了解它的结构对于我们提高程序性能也有比较大的帮助。本节我们将针对切片底层结构、扩容机制、底层数组进行讲解。本节代码存放目录为lesson4切片底层结构我们在使用的时候发现切片与数组很相似,这是......
  • 构建模块化的FastAPI应用: 从用户认证到角色控制
    实现了用户身份验证及角色授权的基本功能。具体来说,当用户尝试访问某些资源时,系统会首先验证用户的身份,然后根据用户的角色来决定是否允许访问特定资源。例如,普通用户只能访问自己的信息,而管理员可以访问额外的管理界面。这种机制保证了系统的安全性,并且可以根据需要灵活地扩展不同......