可以在返回response后运行后台任务。
这对于在请求之后需要进行的操作很有用,但是客户端实际上并不需要在收到响应之前就等待操作完成。
例如,这包括:
- 执行操作后发送的电子邮件通知:
- 由于连接到电子邮件服务器并发送电子邮件的过程通常很慢(几秒钟),因此您可以立即返回响应并在后台发送电子邮件通知。
- 处理数据:
- 例如,假设您收到的文件必须经过缓慢的处理,您可以返回“已接受”(HTTP 202)响应,并在后台对其进行处理。
使用BackgroundTasks
- 例如,假设您收到的文件必须经过缓慢的处理,您可以返回“已接受”(HTTP 202)响应,并在后台对其进行处理。
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。
本文介绍如何在FastAPI中使用BackgroundTasks执行后台任务,如发送邮件通知和数据处理,无需客户端等待,提升用户体验。同时讨论了在大量计算场景下使用如Celery等更大工具的必要性。
1284

被折叠的 条评论
为什么被折叠?



