资源管理新视角:利用 FastAPI Lifespan 事件优化你的应用

在FastAPI中,Lifespan 是一个用于管理应用生命周期的事件,它允许你在应用启动前和关闭后执行特定的代码。这在你需要设置一些在应用整个生命周期中都会用到的资源,或者在应用结束后需要进行清理的情况下非常有用。

场景描述:
假设你正在开发一个机器学习 Web 服务,该服务允许用户上传图片,并返回图片内容的预测结果。为了提供服务,你需要在应用启动时加载一个预先训练好的模型到内存中,以便能够快速进行预测。当应用停止时,你需要释放这个模型,以便于资源的回收。

文字示例:

  1. 应用启动:当你启动应用时,你首先需要加载模型。这个加载操作可能会花费一些时间,并且需要在应用开始接收请求之前完成。
  2. 接收请求:一旦模型加载完成,你的应用就会开始接收用户的预测请求。
  3. 处理请求:对于每个预测请求,应用会使用已加载的模型来分析用户上传的图片,并返回预测结果。
  4. 应用关闭:当你关闭应用时,你希望释放加载的模型,以便释放占用的内存和其他资源。

Mermaid 流程图:

### FastAPI 中 `lifespan` 功能详解 #### 一、功能概述 FastAPI 提供了一个名为 `lifespan` 的参数用于定义应用程序生命周期中的事件处理函数。这些事件主要分为启动前(`startup`)和关闭后(`shutdown`)两类,在应用初始化之前以及结束之后执行相应的逻辑操作[^2]。 #### 二、具体实现方式 通过装饰器或者直接传递给 FastAPI 实例化对象来指定 `lifespan` 函数。此函数应该是一个异步上下文管理器 (`@asynccontextmanager`),它允许开发者在其中编写启动时建立资源(比如数据库连接),并在程序终止时释放这些资源的代码片段。 ```python from contextlib import asynccontextmanager from fastapi import FastAPI # 假设这里有一个数据库模块db.py提供了database对象 from db import database @asynccontextmanager async def manage_database(app: FastAPI): await database.connect() try: yield finally: await database.disconnect() app = FastAPI(lifespan=manage_database) ``` 上述代码展示了如何利用 `lifespan` 参数配合自定义的异步上下文管理器来进行数据库连接池的创建与销毁工作。 #### 三、官方文档示例解析 根据官方给出的例子可以更清晰地理解其应用场景: 当集成 Tortoise ORM 或其他第三方库时,可能需要确保每次请求都能访问到有效的会话/事务环境;而使用 `lifespan` 就能很好地解决这个问题——即可以在服务启动之初就准备好必要的依赖项,并于停止之时清理它们[^3]。 对于 MongoDB 连接而言,则可以通过类似的方式完成同样的目标: ```python from motor.motor_asyncio import AsyncIOMotorClient from fastapi import FastAPI class MongoConnectionManager: def __init__(self, uri: str): self.uri = uri self.client = None async def startup(self): self.client = AsyncIOMotorClient(self.uri) async def shutdown(self): self.client.close() mongo_manager = MongoConnectionManager('mongodb://localhost:27017') @app.on_event("startup") async def start_mongo(): await mongo_manager.startup() @app.on_event("shutdown") async def stop_mongo(): await mongo_manager.shutdown() ``` 这段代码实现了基于 `on_event()` 方法的手动注册启动和关闭回调的效果,虽然不是严格意义上的 `lifespan` 用法,但在某些情况下也能达到相同的目的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值