
本文详细介绍了如何使用 fastapi 的 lifespan 事件结合 asynccontextmanager 在应用启动后、处理任何请求之前执行一次性初始化任务。通过此机制,开发者可以确保数据库连接、缓存预加载等操作在服务可用时已完成,同时避免阻塞服务器启动过程。
在构建基于 FastAPI 的 Web 服务时,我们经常需要在应用程序启动后、开始处理用户请求之前执行一些初始化操作。这些操作可能包括:
直接在 if __name__ == "__main__": 块中调用这些函数,如果放在 uvicorn.run(app) 之前,会阻塞服务器启动,导致服务无法及时响应;如果放在 uvicorn.run(app) 之后,则根本不会被执行,因为 uvicorn.run(app) 是一个阻塞调用,会一直运行直到服务器关闭。因此,我们需要一个机制,让 FastAPI 框架自身来管理这些启动事件。
FastAPI 提供了 lifespan 事件管理机制,它基于 Python 的 contextlib.asynccontextmanager,允许开发者定义在应用启动和关闭时执行的异步代码。这是处理一次性初始化任务的官方推荐方式。
lifespan 的核心思想是定义一个异步上下文管理器。当应用启动时,上下文管理器会执行 yield 语句之前的代码;当应用准备好接收请求时,它会 yield 控制权,此时服务开始处理请求;当应用关闭时,它会执行 yield 语句之后(即上下文退出时)的代码,用于资源清理。
假设我们有一个需求,在 FastAPI 应用启动后,需要执行一个耗时操作(例如,模拟数据加载),然后初始化一个全局变量 DATA。
import time
import uvicorn
from fastapi import FastAPI
from contextlib import asynccontextmanager
# 全局变量,用于存储初始化后的数据
DATA = {"value": ""}
def create_data():
"""
模拟一个耗时的初始化函数,用于在应用启动时加载数据。
"""
print("正在执行 create_data()...")
time.sleep(2) # 模拟耗时操作,例如从数据库加载数据或进行复杂的计算
DATA["value"] = "Hello World!"
print("create_data() 执行完毕。")
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
FastAPI 应用的生命周期管理器。
在应用启动时执行 create_data(),并在应用关闭时执行清理操作(如果需要)。
"""
# --- 应用启动时执行的代码 ---
create_data() # 在这里调用我们的初始化函数
print("FastAPI 应用已启动,准备接收请求。")
yield # 应用在此处开始接收请求,yield 之前的代码在启动前完成
# --- 应用关闭时执行的代码 ---
print("FastAPI 应用正在关闭。")
# 可以在这里执行清理操作,例如关闭数据库连接、释放资源等
DATA["value"] = "" # 清理数据,模拟资源释放
print("清理工作完成。")
# 将 lifespan 事件管理器传递给 FastAPI 应用
app = FastAPI(lifespan=lifespan)
@app.get("/")
def get_root():
"""
一个简单的 GET 接口,返回 DATA 中存储的值。
"""
return DATA
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)当你运行上述代码时,你会观察到以下输出顺序:
正在执行 create_data()... create_data() 执行完毕。 FastAPI 应用已启动,准备接收请求。 INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: Started reloader process [xxxxx] using statreload INFO: Started server process [xxxxx] INFO: Waiting for application startup. INFO: Application startup complete.
然后,如果你访问 http://localhost:8000,你会得到 {"value": "Hello World!"},这证明 create_data() 已经成功执行并更新了 DATA 变量。
当你按下 CTRL+C 停止服务器时,你会看到:
INFO: Shutting down FastAPI 应用正在关闭。 清理工作完成。 INFO: Finished server process [xxxxx] INFO: Stopped reloader process [xxxxx]
这表明 yield 之后的清理代码也得到了正确执行。
通过 FastAPI 的 lifespan 事件结合 asynccontextmanager,我们可以优雅且高效地管理应用的启动和关闭事件。这种机制确保了在服务正式对外提供前,所有必要的初始化工作都能顺利完成,并且在服务关闭时能够进行必要的资源清理。掌握 lifespan 是构建健壮和可维护的 FastAPI 应用的关键一环。
以上就是FastAPI 应用启动后执行一次性任务的正确姿势的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号