news 2026/4/22 17:15:38

python之Starlete的lifespan使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python之Starlete的lifespan使用

一、lifespan 是什么?

lifespan是 Starlette 提供的应用生命周期管理机制,用于定义应用启动(startup)和关闭(shutdown)时需要执行的操作,比如:

  • 启动时:初始化数据库连接池、加载配置文件、启动定时任务、创建缓存实例;
  • 关闭时:关闭数据库连接、释放资源、保存临时数据、停止定时任务。

它替代了 Starlette 旧版本中的on_startup/on_shutdown钩子,是当前推荐的生命周期管理方式(更符合 ASGI 规范)。

二、核心使用方式

Starlette 的lifespan支持两种写法:装饰器写法(简单场景)和上下文管理器写法(复杂场景),下面分别演示。

前置准备

先安装依赖(确保 Starlette 版本 ≥ 0.25.0,推荐最新版):

pipinstallstarlette uvicorn
1. 装饰器写法(推荐新手)

适合启动/关闭逻辑简单、无需共享状态的场景,用@app.lifespan装饰异步函数,函数返回{"startup": 启动函数, "shutdown": 关闭函数}

fromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponseimportasyncio# 创建应用实例app=Starlette(debug=True)# ---------------------- 生命周期函数 ----------------------# 启动时执行asyncdefstartup_event():print("🚀 应用启动中...")# 模拟初始化数据库连接池awaitasyncio.sleep(1)# 模拟异步操作app.state.db="已初始化的数据库连接池"# 把资源存在app.state中,供视图使用print("✅ 应用启动完成(数据库连接已初始化)")# 关闭时执行asyncdefshutdown_event():print("🔌 应用关闭中...")# 模拟关闭数据库连接awaitasyncio.sleep(1)app.state.db=None# 释放资源print("❌ 应用关闭完成(数据库连接已释放)")# 注册生命周期钩子@app.lifespanasyncdeflifespan_manager(_):return{"startup":startup_event,"shutdown":shutdown_event}# ---------------------- 普通视图 ----------------------@app.route("/")asyncdefhomepage(request):# 从app.state获取生命周期中初始化的资源db_status="已连接"ifrequest.app.state.dbelse"未连接"returnJSONResponse({"message":"Hello Starlette","db_status":db_status})

运行命令:

uvicorn main:app --reload

运行效果

  • 启动时控制台输出:🚀 应用启动中...✅ 应用启动完成
  • 访问http://127.0.0.1:8000,返回{"message":"Hello Starlette","db_status":"已连接"}
  • 停止应用(按 Ctrl+C)时,控制台输出:🔌 应用关闭中...❌ 应用关闭完成
2. 上下文管理器写法(进阶)

适合需要更精细控制生命周期、或启动/关闭逻辑有依赖关系的场景(比如启动时创建的资源需要在关闭时显式清理),通过async with实现。

fromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponseimportasyncio app=Starlette(debug=True)# 上下文管理器风格的lifespan@app.lifespanasyncdeflifespan_manager(app):# ---------------------- 启动阶段(async with 进入时) ----------------------print("🚀 应用启动中(上下文管理器版)...")# 初始化资源app.state.redis="已初始化的Redis连接"awaitasyncio.sleep(1)print("✅ 启动完成(Redis已连接)")yield# 核心:yield 之前是启动逻辑,之后是关闭逻辑# ---------------------- 关闭阶段(async with 退出时) ----------------------print("🔌 应用关闭中(上下文管理器版)...")# 释放资源app.state.redis=Noneawaitasyncio.sleep(1)print("❌ 关闭完成(Redis已断开)")@app.route("/redis")asyncdefredis_status(request):redis_status="已连接"ifrequest.app.state.rediselse"未连接"returnJSONResponse({"message":"Redis状态","redis_status":redis_status})

核心特点

  • yield是分界点:代码执行到yield时,应用开始接收请求;
  • 应用关闭时,会执行yield之后的代码,确保资源被正确清理;
  • 这种写法更符合 Python 上下文管理器的习惯,也支持异常处理(比如在try/finally中包裹逻辑)。
3. 独立定义 lifespan(解耦写法)

如果生命周期逻辑复杂,可把lifespan抽成独立函数,再传给Starlette构造函数,代码更整洁:

fromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponse# 独立的lifespan函数asyncdefcustom_lifespan(app):# 启动逻辑app.state.config={"env":"dev","port":8000}yield# 关闭逻辑app.state.config=None# 创建应用时指定lifespanapp=Starlette(debug=True,lifespan=custom_lifespan,# 传入独立的lifespanroutes=[app.route("/config")(lambdarequest:JSONResponse(request.app.state.config))])

三、关键注意事项

  1. app.state的使用
    • 生命周期中初始化的资源(如数据库连接、配置),建议存在app.state中,视图函数可通过request.app.state访问;
    • app.state是全局的,多个请求共享,需注意异步安全(比如数据库连接池本身是异步安全的)。
  2. 必须是异步函数
    • lifespan及内部的启动/关闭函数都必须用async def定义,不能用同步函数;
    • 如果需要执行同步阻塞操作(比如加载本地大文件),建议用asyncio.to_thread包装,避免阻塞事件循环。
  3. 异常处理
    • 启动阶段如果抛出异常,应用会直接退出,不会接收请求;
    • 可在lifespan中加try/except捕获异常,比如:
      @app.lifespanasyncdeflifespan_manager(app):try:# 启动逻辑app.state.db=awaitinit_db()yieldexceptExceptionase:print(f"启动失败:{e}")raise# 重新抛出异常,让应用退出finally:# 关闭逻辑(无论是否异常都会执行)ifapp.state.db:awaitapp.state.db.close()

总结

  1. Starlette 的lifespan是管理应用启动/关闭生命周期的核心机制,替代了旧的on_startup/on_shutdown
  2. 常用两种写法:装饰器写法(简单场景)和上下文管理器写法(进阶/复杂场景),核心是通过app.state共享初始化的资源;
  3. lifespan函数必须是异步的,启动阶段异常会导致应用退出,关闭阶段建议通过finally确保资源释放。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 15:45:22

真空乳化机远程监控运维管理系统方案

真空乳化机作为日化、食品、医药、化工等行业的核心生产设备,其运行稳定性、乳化工艺精度及设备运维效率直接影响产品乳化均匀度、生产批次一致性与产能交付效率,是保障企业生产质量与市场竞争力的关键基础设施。传统运维模式下,真空乳化机多…

作者头像 李华
网站建设 2026/4/18 3:51:04

如何选择适合GPT-SoVITS的GPU配置?算力需求分析

如何选择适合 GPT-SoVITS 的 GPU 配置?算力需求深度解析 在个性化语音合成技术迅速普及的今天,一个只需一分钟语音就能“克隆”出你声音的 AI 模型——GPT-SoVITS,正悄然改变着内容创作、虚拟人交互和无障碍通信的方式。它不像传统语音系统那…

作者头像 李华
网站建设 2026/4/20 22:05:02

【收藏级干货】大模型开发入门指南:从LLM到Agent的核心技术栈全解析

本文以通俗易懂的方式解释了大语言模型(LLM)及相关技术的基本概念。从LLM本质是文字接龙开始,详细解析了Transformer架构中的自注意力机制,介绍了Prompt工程、API调用、Function Calling等关键技术,并探讨了Agent、MCP和A2A等高级概念。文章强…

作者头像 李华
网站建设 2026/4/18 13:47:33

Windows系统性能终极优化:一键加速的完整解决方案

Windows系统性能终极优化:一键加速的完整解决方案 【免费下载链接】win10script This is the Ultimate Windows 10 Script from a creation from multiple debloat scripts and gists from github. 项目地址: https://gitcode.com/gh_mirrors/wi/win10script …

作者头像 李华
网站建设 2026/4/21 16:47:29

HotPatcher:重新定义虚幻引擎热更新的企业级解决方案

HotPatcher:重新定义虚幻引擎热更新的企业级解决方案 【免费下载链接】HotPatcher Unreal Engine hot update manage and package plugin. 项目地址: https://gitcode.com/gh_mirrors/ho/HotPatcher 在游戏行业激烈竞争的今天,如何实现无缝版本更…

作者头像 李华
网站建设 2026/4/18 5:42:47

ChatALL革命:40+AI模型并行工作,效率提升300%的终极方案

ChatALL革命:40AI模型并行工作,效率提升300%的终极方案 【免费下载链接】ChatALL Concurrently chat with ChatGPT, Bing Chat, Bard, Alpaca, Vicuna, Claude, ChatGLM, MOSS, 讯飞星火, 文心一言 and more, discover the best answers 项目地址: ht…

作者头像 李华