0

0

利用 FastAPI Lifespan 管理应用启动与关闭事件

霞舞

霞舞

发布时间:2025-10-30 08:52:10

|

298人浏览过

|

来源于php中文网

原创

利用 FastAPI Lifespan 管理应用启动与关闭事件

本文详细介绍了如何在 fastapi 应用启动后,但在处理任何请求之前,执行一次性初始化任务。通过利用 fastapi 的 `lifespan` 事件处理器和 `asynccontextmanager`,开发者可以优雅地管理应用程序的生命周期,确保数据加载、数据库连接等关键设置在服务器上线前完成,并能在关闭时进行资源清理,从而构建更健壮、专业的应用。

在构建 FastAPI 应用程序时,经常会遇到需要在服务器启动时执行一次性初始化任务的需求,例如加载配置文件、连接数据库、预热缓存或执行某些数据准备工作。这些任务必须在应用程序开始处理客户端请求之前完成。如果处理不当,可能会导致服务器启动阻塞、数据不一致或资源管理混乱。FastAPI 提供了强大的 lifespan 事件处理器来优雅地管理这些生命周期事件。

FastAPI Lifespan 事件处理器

FastAPI 的 lifespan 事件处理器是管理应用程序启动和关闭过程的推荐机制。它基于 Python 的 contextlib.asynccontextmanager,允许开发者定义在应用启动前执行的逻辑(即在 yield 语句之前),以及在应用关闭时执行的清理逻辑(即在 yield 语句之后)。这种模式确保了初始化任务的顺序性,并且在应用程序生命周期内提供了清晰的资源管理。

实现应用启动时的一次性任务

为了在 FastAPI 应用启动后、接收请求前执行一次性任务,我们需要遵循以下步骤:

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载
  1. 定义初始化函数:创建需要执行的初始化逻辑,例如加载数据或建立连接。
  2. 创建 asynccontextmanager:使用 @asynccontextmanager 装饰器定义一个异步上下文管理器函数,该函数将作为 lifespan 处理器。
  3. 在 yield 前执行任务:将初始化函数调用放置在 lifespan 函数的 yield 语句之前。这将确保在应用程序开始处理请求之前,所有启动逻辑都已完成。
  4. 将 lifespan 传入 FastAPI 应用:在创建 FastAPI 实例时,通过 lifespan 参数指定我们定义的上下文管理器。

下面是一个具体的示例,演示如何使用 lifespan 在 FastAPI 服务器启动后加载全局数据:

import time
import uvicorn
from fastapi import FastAPI
from contextlib import asynccontextmanager

# 模拟全局数据或资源
DATA = {"value": ""}

# 模拟需要执行的初始化函数,例如加载数据
def create_data():
    """
    此函数模拟一个耗时的数据初始化过程。
    它会在应用启动时被调用一次。
    """
    print(">>> [启动阶段] 正在执行数据初始化...")
    time.sleep(2)  # 模拟耗时操作,例如从数据库加载数据
    DATA["value"] = "Hello World! (Data Loaded by Lifespan)"
    print("<<< [启动阶段] 数据初始化完成。")

# 定义应用生命周期管理器
@asynccontextmanager
async def app_lifespan(app: FastAPI):
    """
    FastAPI 应用的生命周期管理器。
    在 'yield' 之前执行启动逻辑,在 'yield' 之后执行关闭逻辑。
    """
    # --- 启动阶段 ---
    print(">>> 应用启动中...")
    create_data()  # 在应用启动并接收请求前执行一次性任务
    print("<<< 应用准备就绪,开始接收HTTP请求。")
    yield # 应用程序在此点开始处理请求
    # --- 关闭阶段 ---
    print(">>> 应用关闭中...")
    # 可以在此处添加资源清理逻辑,例如关闭数据库连接池、释放文件句柄等
    # 例如:close_database_connection()
    print("<<< 应用已关闭。")

# 创建FastAPI应用实例,并传入自定义的lifespan管理器
app = FastAPI(lifespan=app_lifespan)

@app.get("/")
def get_root():
    """
    一个简单的API端点,返回由启动任务初始化的数据。
    """
    return {"message": DATA["value"]}

if __name__ == "__main__":
    print("尝试启动 FastAPI 应用...")
    uvicorn.run(app, host="0.0.0.0", port=8000)
    print("FastAPI 应用已退出。")

代码解析与注意事项

  1. DATA = {"value": ""}:这是一个简单的全局字典,用于模拟在应用启动时需要初始化的数据。
  2. create_data() 函数
    • 这个函数包含了具体的初始化逻辑,例如 time.sleep(2) 模拟了一个耗时操作。
    • 它是一个同步函数。在 lifespan 的启动阶段(yield 之前)调用同步阻塞函数是可行的,因为 lifespan 本身会等待这些任务完成。这意味着服务器不会开始处理请求,直到 create_data 完成。这正是许多场景下期望的行为。
  3. @asynccontextmanager 装饰器
    • 这是 contextlib 模块提供的一个强大工具,用于将异步生成器函数转换为异步上下文管理器。
    • 它使得 app_lifespan 函数能够像 with 语句一样管理资源的进入和退出。
  4. async def app_lifespan(app: FastAPI):
    • 这是我们自定义的生命周期处理器。FastAPI 会在应用启动时调用它。
    • app 参数是当前的 FastAPI 应用实例,可以在生命周期函数中访问它。
  5. create_data() 调用位置
    • create_data() 被放在 yield 语句之前。这保证了在 yield 之后的代码(即应用程序开始处理 HTTP 请求)执行之前,数据初始化任务已经完成。
  6. yield 关键字
    • yield 是 lifespan 事件处理器的核心。当执行流到达 yield 时,表示应用程序已经完成了所有启动准备,现在可以开始接收和处理 HTTP 请求了。
    • yield 之后的部分则用于处理应用程序关闭时的清理工作。当服务器关闭时(例如通过 Ctrl+C 停止 uvicorn),执行流会从 yield 之后继续,执行清理逻辑。
  7. app = FastAPI(lifespan=app_lifespan)
    • 在创建 FastAPI 应用实例时,通过 lifespan 参数将我们定义的 app_lifespan 上下文管理器传递给应用。这是激活生命周期事件的关键步骤。

总结

通过 FastAPI 提供的 lifespan 事件处理器,开发者能够以一种结构化且非侵入式的方式,优雅地管理应用程序的启动和关闭过程。这不仅确保了在服务器上线前完成必要的初始化任务,还提供了在应用关闭时进行资源清理的机制,从而显著提升了 FastAPI 应用的健壮性、可维护性和专业性。对于任何需要进行启动时设置或关闭时清理的 FastAPI 项目,lifespan 都是一个不可或缺的工具。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

251

2026.02.06

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

389

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号