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

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

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

推荐文章

Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
Java环境中使用Elasticsearch
2024-11-18 22:46:32 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
浏览器自动播放策略
2024-11-19 08:54:41 +0800 CST
纯CSS实现3D云动画效果
2024-11-18 18:48:05 +0800 CST
Rust开发笔记 | Rust的交互式Shell
2024-11-18 19:55:44 +0800 CST
Rust 中的所有权机制
2024-11-18 20:54:50 +0800 CST
MySQL数据库的36条军规
2024-11-18 16:46:25 +0800 CST
gin整合go-assets进行打包模版文件
2024-11-18 09:48:51 +0800 CST
windows安装sphinx3.0.3(中文检索)
2024-11-17 05:23:31 +0800 CST
JavaScript设计模式:单例模式
2024-11-18 10:57:41 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
JavaScript设计模式:适配器模式
2024-11-18 17:51:43 +0800 CST
Shell 里给变量赋值为多行文本
2024-11-18 20:25:45 +0800 CST
从Go开发者的视角看Rust
2024-11-18 11:49:49 +0800 CST
程序员茄子在线接单