fastapi(二十一)-后台任务

本文介绍如何在FastAPI中使用BackgroundTasks执行后台任务,如发送邮件通知和数据处理,无需客户端等待,提升用户体验。同时讨论了在大量计算场景下使用如Celery等更大工具的必要性。

可以在返回response后运行后台任务。
这对于在请求之后需要进行的操作很有用,但是客户端实际上并不需要在收到响应之前就等待操作完成。
例如,这包括:

  • 执行操作后发送的电子邮件通知:
    • 由于连接到电子邮件服务器并发送电子邮件的过程通常很慢(几秒钟),因此您可以立即返回响应并在后台发送电子邮件通知。
  • 处理数据:
    • 例如,假设您收到的文件必须经过缓慢的处理,您可以返回“已接受”(HTTP 202)响应,并在后台对其进行处理。
      使用BackgroundTasks
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()


def write_notification(email: str, message=""):
    with open("log.txt", mode="w") as email_file:
        content = f"notification for {email}: {message}"
        email_file.write(content)


@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Notification sent in the background"}

.add_task() 接收作为参数:

  • 在后台运行的任务功能(write_notification)
  • 应该按顺序(email)传递给任务函数的任何参数序列。
  • 应该传递给任务函数(message=“some notification”)的所有关键字参数。
    依赖注入
    通过使用BackgroundTasks也可以与依赖项注入系统一起使用,您可以BackgroundTasks在多个级别上声明类型的参数:在路径操作函数中,在依赖项(可依赖),在子依赖项中等。
from fastapi import BackgroundTasks, Depends, FastAPI

app = FastAPI()


def write_log(message: str):
    with open("log.txt", mode="a") as log:
        log.write(message)


def get_query(background_tasks: BackgroundTasks, q: str = None):
    if q:
        message = f"found query: {q}\n"
        background_tasks.add_task(write_log, message)
    return q


@app.post("/send-notification/{email}")
async def send_notification(
    email: str, background_tasks: BackgroundTasks, q: str = Depends(get_query)
):
    message = f"message to {email}\n"
    background_tasks.add_task(write_log, message)
    return {"message": "Message sent"}

警告
如果您需要执行大量的后台计算,而不必一定要在同一进程中运行它(例如,您不需要共享内存,变量等),则可能会受益于使用其他更大的工具,例如celery。

它们往往需要更复杂的配置,例如RabbitMQ或Redis之类的消息/作业队列管理器,但是它们允许您在多个进程(尤其是多个服务器)中运行后台任务。

要查看示例,请检查Project Generators,它们都包括已经配置的Celery。

但是,如果您需要从同一FastAPI应用访问变量和对象,或者需要执行一些小的后台任务(例如发送电子邮件通知),则只需使用即可BackgroundTasks。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值