在 FastAPI 中,BackgroundTasks 是一个功能,它允许你在发送响应给客户端之后执行后台任务。这些任务对于不需要客户端等待的操作非常有用,比如发送电子邮件通知或处理数据。然而,当服务器重启时,由于 BackgroundTasks 是与单个应用实例的生命周期相关联的,它们不会自动恢复执行。
BackgroundTasks主要适用于不需要跨服务器或长时间运行的轻量级后台任务
。对于更复杂或资源密集型的任务,建议使用专门的任务队列
管理系统。
如何使用 BackgroundTasks
:
- 导入和定义:首先,你需要从
fastapi
导入BackgroundTasks
并在路径操作函数中定义一个参数,类型声明为BackgroundTasks
。
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
- 创建后台任务函数:创建一个函数作为后台任务,它可以是普通的函数或异步函数。
def write_notification(email: str, message: str = ""):
with open("notifications.txt", "a") as f:
f.write(f"Notification for {email}: {message}\n")
- 添加后台任务:在路径操作函数中,使用
.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 应用程序时非常有用的功能。