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

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

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(),可以大幅提升项目的可维护性和健壮性。

推荐文章

利用Python构建语音助手
2024-11-19 04:24:50 +0800 CST
Vue3中如何处理状态管理?
2024-11-17 07:13:45 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
CentOS 镜像源配置
2024-11-18 11:28:06 +0800 CST
MySQL 日志详解
2024-11-19 02:17:30 +0800 CST
JavaScript设计模式:单例模式
2024-11-18 10:57:41 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
Mysql允许外网访问详细流程
2024-11-17 05:03:26 +0800 CST
PHP 微信红包算法
2024-11-17 22:45:34 +0800 CST
如何在Vue 3中使用Ref访问DOM元素
2024-11-17 04:22:38 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
Elasticsearch 监控和警报
2024-11-19 10:02:29 +0800 CST
windon安装beego框架记录
2024-11-19 09:55:33 +0800 CST
Go语言中实现RSA加密与解密
2024-11-18 01:49:30 +0800 CST
使用 node-ssh 实现自动化部署
2024-11-18 20:06:21 +0800 CST
LangChain快速上手
2025-03-09 22:30:10 +0800 CST
Vue 3 中的 Watch 实现及最佳实践
2024-11-18 22:18:40 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
API 管理系统售卖系统
2024-11-19 08:54:18 +0800 CST
程序员茄子在线接单