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

news2024/9/21 14:24:47

本文说明在 FastAPI 应用程序中使用 lifespan 事件来管理资源的加载和卸载。lifespan 事件允许你在应用启动时执行一些初始化代码,并在应用关闭时执行一些清理代码。这是通过使用异步上下文管理器实现的,具体来说,是通过 asynccontextmanager 装饰器创建一个异步生成器函数。
在这里插入图片描述

# 导入asynccontextmanager用于创建异步上下文管理器
from contextlib import asynccontextmanager
# 导入FastAPI,用于创建和管理Web应用
from fastapi import FastAPI

# 定义一个模拟的机器学习模型函数,它接受一个浮点数x并返回x乘以42的结果
def fake_answer_to_everything_ml_model(x: float):
    return x * 42

# 创建一个空字典,用于存储机器学习模型
ml_models = {}

# 使用asynccontextmanager装饰器定义一个异步上下文管理器函数lifespan
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 在异步上下文管理器中,"进入上下文"时加载机器学习模型
    ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
    # yield
    yield
    # 在异步上下文管理器中,"退出上下文"时清理机器学习模型,释放资源
    ml_models.clear()

# 创建FastAPI应用实例,并将lifespan函数作为其生命周期管理器
app = FastAPI(lifespan=lifespan)

# 定义一个GET请求路由,用于处理预测请求
@app.get("/predict")
async def predict(x: float):
    # 从ml_models字典中获取模型,并使用它对输入值x进行预测
    result = ml_models["answer_to_everything"](x)
    # 返回预测结果
    return {"result": result}

在这段代码中,lifespan 函数作为异步上下文管理器,负责在FastAPI应用启动时加载机器学习模型,并在应用关闭时清理模型。这样的设计模式确保了应用在运行时能够有效地管理资源。predict 路由函数提供了一个接口,允许用户通过HTTP请求发送数据,并获取模型的预测结果。

代码解释:

  1. 导入必要的库:asynccontextmanager 用于创建异步上下文管理器,FastAPI 是 FastAPI 框架的核心类。

  2. 定义一个模拟的机器学习模型函数 fake_answer_to_everything_ml_model,它接受一个浮点数 x 并返回 x * 42

  3. 创建一个全局字典 ml_models,用于存储机器学习模型。

  4. 使用 @asynccontextmanager 装饰器定义一个异步上下文管理器 lifespan,它接受一个 FastAPI 实例作为参数。

  5. lifespan 函数中,使用 yield 语句之前的代码块来加载模型。在这个例子中,模型加载操作被模拟为将模型函数添加到 ml_models 字典中。

  6. yield 语句之后的代码块用于在应用关闭时执行清理操作,这里它清除了 ml_models 字典。

  7. 创建一个 FastAPI 实例,并将其 lifespan 参数设置为 lifespan 函数。

  8. 定义一个路由处理函数 predict,它使用加载的模型来处理预测请求,并返回结果。

实际作用:

  • 在应用启动时,lifespan 函数中的代码在 yield 之前被执行,模拟加载模型的操作。
  • 应用开始接收请求后,predict 路由可以被调用,使用已加载的模型来处理请求。
  • 当应用关闭时,lifespan 函数中的代码在 yield 之后被执行,进行资源的清理。

在 Python 的异步上下文管理器中,yield 关键字扮演着非常重要的角色。它用于定义上下文管理器的执行流程,特别是在异步上下文管理器(使用 asynccontextmanager 装饰的生成器函数)中。

理解 yield 在异步上下文管理器中的作用:

  1. 定义执行点:在异步上下文管理器中,yield 语句定义了异步生成器在执行时的暂停和恢复点。当进入上下文时,代码执行到 yield 语句,生成器会暂停,等待外部代码执行。一旦退出上下文,生成器会继续执行 yield 之后的代码。

  2. 上下文的分割yield 将上下文管理器的代码分为两部分:

    • 进入上下文yield 之前的代码,用于设置必要的资源或状态。在异步上下文管理器中,这通常包括资源的初始化和分配。
    • 退出上下文yield 之后的代码,用于清理资源或恢复状态。在异步上下文管理器中,这通常包括资源的释放和清理。

示例解释:

在你提供的代码中:

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Load the ML model
    ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
    yield
    # Clean up the ML models and release the resources
    ml_models.clear()
  • 进入上下文:在 yield 之前的部分,ml_models 字典被用来存储一个模拟的机器学习模型。这模拟了在应用启动时加载模型的过程。
  • 退出上下文yield 之后的代码在上下文管理器退出时执行,这里它清除 ml_models 字典,模拟了在应用关闭时卸载模型和释放资源的过程。

异步上下文管理器的使用:

当使用 async with 语句块时,进入点是 async with 后面的代码块开始执行的地方,而退出点是该代码块执行完毕的地方。例如:

async with lifespan(app) as manager:
    # 这里可以访问和使用上下文中的资源
    pass

在这个 async with 块中,进入上下文的代码在 lifespan 函数被调用时执行,直到遇到 yieldyield 之后的代码在 async with 块的代码执行完毕后执行。yield 在异步上下文管理器中是一个关键的执行控制点,它定义了资源的生命周期,确保资源在使用前后都能得到妥善的处理。

简单的两个 Demo:

当然,以下是上述两个示例代码:

Demo 1:数据库连接

# 导入必要的库
from contextlib import asynccontextmanager
from fastapi import FastAPI
import asyncpg

# 定义数据库连接的URL
DATABASE_URL = "postgres://user:password@localhost/dbname"

# 使用asynccontextmanager装饰器定义一个异步上下文管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 异步连接数据库
    connection = await asyncpg.connect(DATABASE_URL)
    # 将数据库连接存储在app.state中,以便在应用中其他地方使用
    app.state.db = connection
    yield
    # 在上下文结束时关闭数据库连接
    await app.state.db.close()

# 创建FastAPI应用实例,并传入lifespan函数
app = FastAPI(lifespan=lifespan)

# 定义一个路由,用于获取数据库中的数据
@app.get("/get_data")
async def get_data():
    # 从app.state中获取数据库连接
    db = app.state.db
    # 执行SQL查询并返回结果
    return {"data": await db.fetch("SELECT * FROM my_table")}

Demo 2:启动时加载配置文件

# 导入必要的库
from contextlib import asynccontextmanager
from fastapi import FastAPI

# 创建一个空字典,用于存储配置信息
config = {}

# 使用asynccontextmanager装饰器定义一个异步上下文管理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 模拟加载配置文件,这里只是简单地将一个配置项设置为一个值
    config['setting'] = 'some_value'
    # 将配置信息存储在app.state中,以便在应用中其他地方使用
    app.state.config = config
    yield
    # 在上下文结束时清理配置信息(如果有必要的话)
    config.clear()

# 创建FastAPI应用实例,并传入lifespan函数
app = FastAPI(lifespan=lifespan)

# 定义一个路由,用于获取当前的配置信息
@app.get("/get_config")
async def get_config():
    # 从app.state中返回配置信息
    return app.state.config

在这两个示例中,lifespan 函数作为一个异步上下文管理器,负责在应用启动时初始化资源(如数据库连接或配置信息),并在应用关闭时进行清理。这样的模式有助于确保资源被正确管理,防止资源泄露。

在这两个 Demo 中,第一个演示了如何在应用启动时建立数据库连接,并在应用关闭时关闭连接。第二个演示了如何在应用启动时加载配置,并在应用关闭时进行清理。这些操作都是在 lifespan 事件中管理的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自由流转--实例

一、自由流转的形态 流转能力打破设备界限,多设备联动,使用户应用程序可分可合、可流转,实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。 二、跨端迁移 在应用开发层面,跨端迁移指在A端运行的UIAbility迁移到B端上…

店群合一模式下的社区团购新发展——结合链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序源码

摘要:本文探讨了店群合一的社区团购平台在当今商业环境中的重要性和优势。通过分析店群合一模式如何将互联网社群与线下终端紧密结合,阐述了链动 21 模式、AI 智能名片和 S2B2C 商城小程序源码在这一模式中的应用价值。这些创新元素的结合为社区团购带来…

四、(JS)JS中常见的加载事件

一、文档加载监听 (1)抛出疑惑,什么是文档加载监听?为什么要有这个东西? 老样子,我们先讲一个场景,带着大家熟悉为什么会有文档加载监听,是来解决什么问题来着的。 我们先看下这段…

无心剑七绝《中秋相思》

七绝中秋相思 中秋月满意深长 百代江阳老窖香 莫道天涯情不尽 相思寸寸赋华章 2023年9月29日 平水韵七阳平韵 这首诗七绝《中秋相思》由无心剑所作,以其深情的笔触描绘了中秋夜的相思之情。 诗中首句“中秋月满意深长”即以中秋圆月为起点,勾勒出了一幅…

相同的数--(力扣)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1 输入:p [1,2,3], q [1,2,3] 输出:true示例 2: 输入…

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿&…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月16日,星期一

每天一分钟,知晓天下事! 2024年9月16日 星期一 农历八月十四 1、 台风“贝碧嘉”来袭,上海、杭州发文提醒市民非必要不外出;上海市内高速全部封闭。 2、 中秋假期第一天最热门目的地出炉:北京、成都、上海包揽前三。 …

下一代 推荐系统:多智能体 + 深度强化学习,充分利用文本信息,更深刻的理解用户真实需求和兴趣点

下一代 AI 医疗:知识图谱RAG 多智能体 大模型 推荐,是否有必要?方案一:基于内容的 Agent 推荐方案二:多智能体深度强化学习 推荐强化学习:看、干、想的过程多智能体框架 方案三:在家慢病自管…

【VSCode】VSCode Background 背景插件辅助窗口程序

前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项,这…

基于AgentUniverse在金融场景中的多智能体应用探索

基于AgentUniverse在金融场景中的多智能体应用探索 1.基于大模型智能体超级状态机 智能体、多智能体都是当下的技术热点,但作为一个技术人应该理解,所有的技术都有自己所针对的问题、及其能力边界,并不存在普适的、放诸业务场景皆 work 的技术方案。在这里尝试区分,从大模…

Cubieboard2(四) 系统构建 —— 基于 mainline

文章目录 1 环境准备1.1 编译环境准备1.2 主线源码准备1.2.1 linux 源码1.2.2 U-Boot 源码1.2.3 启动文件 boot.scr1.2.4 根文件系统 rootfs 2 内核编译2.1 添加 tenda aic8800 驱动(可选)2.2 编译 linux 内核 3 U-Boot 编译4 分区与烧录4.1 sdcard 分区…

Pocketpair澄清表示《幻兽帕鲁》无意转型免费游戏

有报道称,Pocketpair的首席执行官沟部拓郎接受采访暗示,该工作室的热门生存游戏《幻兽帕鲁》可能很快会转为免费游戏,以“延长其寿命”。该工作室现在澄清说,这次采访是几个月前进行的,目前不再有这样的计划。 “我们…

[产品管理-19]:NPDP新产品开发 - 17 - 产品设计与开发工具 - 实体化设计工具:联合分析、功能分析、FAST技术图和逆向工程

目录 前言: 一、什么是实体化设计 1.1 什么是实体化设计 1、定义与概述 2、设计流程 3、关键要素 4、应用领域 5、举例说明 1.2 实体化设计与概念设计的区别 实体化设计 概念设计 区别归纳 1.3 实体化设计与初步设计、规格设计的区别 1、定义与目的 …

Matlab simulink建模与仿真 第十四章(信号输出库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号输出库中的模块概览 注:部分模块在第二章中有介绍,本章不再赘述。 二、文件及工作空间模块 1、To File文件模块 (1)在MATLAB中可用MAT文件对工作区的…

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6986 标注数量(xml文件个数):6986 标注数量(txt文件个数):6986 标注…

理解Android开发中的MVC、MVVM和MVP设计模式

全篇大概1600 字,建议阅读时间10分钟。 引言 在 Android 应用开发中,设计模式是帮助开发者构建结构清晰、可维护性高的应用程序的关键工具。MVC(Model-View-Controller)、MVVM(Model-View-ViewModel)和 MV…

基于双向RRT算法的三维空间最优路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT(Randomly Exploring Random Trees, 随机探索随机树)算法的三维空间最优路径规划是一种解…

??Ansible介绍

文章目录 一、Ansible基本概述1、什么是以及特性1)是什么:2)功能 2、架构下充当的角色:3、同软件对比Ansible与SaltStack*YAML的基本语法 Ansible与其他同类软件对比 4、Ansible的架构组成5、Ansible的执行流程 二、简单测试Ansib…

【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化

先上图,不知你有没有注意过这个现象呢? 一个物体加上了Rigidbody组件,当勾选上Use Gravity时,运行后,这个物体的位置的值会有变化。这是为什么呢? 刚体由物理系统处理,因此它会对重力、碰撞等做…

Spring注解@Value的基本知识(附Demo)

目录 前言1. 基本知识2. 高级用法3. 彩蛋 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 Value 是 Spr…