编程 FastAPI 项目启动/关闭事件实战:数据库连接、缓存预热、模型加载一站式搞定!

2025-05-14 10:10:04 +0800 CST views 427

FastAPI 项目启动/关闭事件实战:数据库连接、缓存预热、模型加载一站式搞定!

在实际开发中,我们常常会遇到这样的需求:

  • ✅ 项目启动时,需要初始化数据库连接、加载机器学习模型、预热缓存等;
  • ✅ 项目关闭时,需要优雅释放资源,防止“僵尸进程”或资源泄露。

好消息是:FastAPI 原生支持生命周期事件机制(startup/shutdown),而且实现方式十分优雅!


🔧 一、FastAPI 的生命周期事件机制简介

FastAPI 提供两种方式来注册生命周期事件:

方法一:使用 @app.on_event() 装饰器(经典方式)

from fastapi import FastAPI

app = FastAPI()

@app.on_event("startup")
async def startup_event():
    print("应用启动,初始化资源...")

@app.on_event("shutdown")
async def shutdown_event():
    print("应用关闭,释放资源...")

方法二:使用 lifespan() 上下文函数(推荐方式)

自 FastAPI 1.0 起,更推荐使用 lifespan 函数统一管理生命周期,更清晰、更灵活。

from fastapi import FastAPI
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    print("✅ 应用启动 - startup")
    # 初始化资源
    yield
    print("🧹 应用关闭 - shutdown")
    # 清理资源

app = FastAPI(lifespan=lifespan)

🧪 二、实战演练:数据库 + 缓存 + 模型加载

我们模拟一个真实的应用场景:

场景阶段操作内容
启动时连接数据库、预热缓存、加载模型
关闭时关闭数据库连接、清空缓存、卸载模型

📁 项目结构示例

project/
├── main.py
├── utils/
│   ├── database.py
│   ├── cache.py
│   └── model_loader.py

🔌 1. 数据库连接模块 utils/database.py

class DBClient:
    def __init__(self):
        self.connected = False

    async def connect(self):
        print("🔌 正在连接数据库...")
        self.connected = True

    async def disconnect(self):
        print("❌ 正在关闭数据库连接...")
        self.connected = False

db_client = DBClient()

⚡ 2. 缓存模块 utils/cache.py

cache = {}

async def preload_cache():
    print("⚡ 预热缓存中...")
    cache["hot_data"] = [1, 2, 3, 4]

async def clear_cache():
    print("🧹 清理缓存...")
    cache.clear()

🤖 3. 模型加载模块 utils/model_loader.py

model = None

async def load_model():
    global model
    print("🤖 加载机器学习模型...")
    model = "MyModel"

async def unload_model():
    global model
    print("🧼 卸载模型...")
    model = None

🧠 4. 应用入口 main.py

from fastapi import FastAPI
from contextlib import asynccontextmanager

from utils.database import db_client
from utils.cache import preload_cache, clear_cache
from utils.model_loader import load_model, unload_model

@asynccontextmanager
async def lifespan(app: FastAPI):
    # 应用启动逻辑
    await db_client.connect()
    await preload_cache()
    await load_model()
    yield
    # 应用关闭逻辑
    await db_client.disconnect()
    await clear_cache()
    await unload_model()

app = FastAPI(lifespan=lifespan)

@app.get("/")
async def root():
    return {"message": "Hello, FastAPI 生命周期!"}

✅ 控制台运行效果

当你启动 FastAPI 应用时,将看到如下输出:

🔌 正在连接数据库...
⚡ 预热缓存中...
🤖 加载机器学习模型...

关闭应用时:

❌ 正在关闭数据库连接...
🧹 清理缓存...
🧼 卸载模型...

✍️ 总结

FastAPI 的生命周期事件机制为异步初始化和资源管理提供了极大的便利:

  • lifespan() 是更推荐、更现代的做法
  • ✅ 完美支持异步资源初始化(async/await)
  • ✅ 非常适合管理数据库连接、缓存系统、机器学习模型加载、消息队列连接等资源

在实际项目中,合理使用 lifespan(),可以大幅提升项目的可维护性和健壮性。

推荐文章

PHP 的生成器,用过的都说好!
2024-11-18 04:43:02 +0800 CST
HTML和CSS创建的弹性菜单
2024-11-19 10:09:04 +0800 CST
PHP 允许跨域的终极解决办法
2024-11-19 08:12:52 +0800 CST
JavaScript 流程控制
2024-11-19 05:14:38 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
Vue3中如何处理组件的单元测试?
2024-11-18 15:00:45 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
MyLib5,一个Python中非常有用的库
2024-11-18 12:50:13 +0800 CST
api远程把word文件转换为pdf
2024-11-19 03:48:33 +0800 CST
防止 macOS 生成 .DS_Store 文件
2024-11-19 07:39:27 +0800 CST
2025,重新认识 HTML!
2025-02-07 14:40:00 +0800 CST
使用Vue 3和Axios进行API数据交互
2024-11-18 22:31:21 +0800 CST
api接口怎么对接
2024-11-19 09:42:47 +0800 CST
浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
paint-board:趣味性艺术画板
2024-11-19 07:43:41 +0800 CST
JavaScript中设置器和获取器
2024-11-17 19:54:27 +0800 CST
程序员茄子在线接单