fastapi(二十一)-后台任务

可以在返回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。

你可能感兴趣的:(python)