2026/2/9 10:34:51
网站建设
项目流程
asp网站栏目修改,为什么做电商网站,wordpress vr主题,兰州大学网页与网站设计一、asynccontextmanager的作用
asynccontextmanager是 Python 标准库contextlib模块提供的异步上下文管理器装饰器#xff0c;专门用于简化异步场景下上下文管理器的实现。
它的核心特性#xff1a;
装饰异步生成器函数#xff08;使用async def定义#xff0c;包含yield关…一、asynccontextmanager的作用asynccontextmanager是 Python 标准库contextlib模块提供的异步上下文管理器装饰器专门用于简化异步场景下上下文管理器的实现。它的核心特性装饰异步生成器函数使用async def定义包含yield关键字自动封装异步上下文管理器的__aenter__()和__aexit__()方法无需手动实现这两个魔法方法配合async with语句使用实现异步资源的自动获取与释放二、适用场景当你在异步代码中需要管理「需要先获取、使用后必须释放 / 清理」的资源时asynccontextmanager是最优选择典型场景包括异步网络连接异步数据库连接如asyncmy操作 MySQL、异步 Redis 连接、异步 HTTP 客户端连接自动建立 / 关闭连接异步文件操作异步读写文件如aiofiles自动打开 / 关闭文件句柄异步锁 / 信号量异步编程中的asyncio.Lock自动获取 / 释放锁避免死锁异步资源初始化 / 销毁如 FastAPI 的异步应用生命周期管理启动时初始化资源关闭时清理资源简单来说异步场景 资源需要自动管理获取 释放就用asynccontextmanager。三、示例示例中会用到异步文件操作库aiofiles演示异步资源管理先安装pip install aiofiles完整代码# 1. 导入必要模块importasyncioimportaiofilesfromcontextlibimportasynccontextmanager# 2. 使用asynccontextmanager装饰异步生成器实现异步上下文管理器asynccontextmanagerasyncdefasync_file_manager(file_path:str,mode:strr,encoding:strutf-8): 异步文件管理器自动打开/关闭文件封装异步文件操作的资源管理 :param file_path: 文件路径 :param mode: 文件打开模式r/w/a等 :param encoding: 文件编码 # -------- 对应__aenter__()方法获取/初始化资源支持await异步操作 --------file_handleNonetry:# 异步打开文件aiofiles提供异步文件操作需要awaitfile_handleawaitaiofiles.open(file_path,modemode,encodingencoding)print(f✅ 异步打开文件{file_path}模式{mode})# 关键yield资源给async with语句使用类似return但会保留函数状态yieldfile_handle# -------- 对应__aexit__()方法释放/清理资源无论是否发生异常都会执行 --------finally:iffile_handle:# 异步关闭文件需要awaitawaitfile_handle.close()print(f❌ 异步关闭文件{file_path})# 3. 使用异步上下文管理器配合async with语句asyncdefmain():# 示例1异步读取文件先创建一个测试文件test.txt写入一些内容test_file_pathtest.txt# 第一步先异步写入测试内容使用async_file_managerasyncwithasync_file_manager(test_file_path,modew)asf:awaitf.write(Hello, asynccontextmanager!\n)awaitf.write(这是异步文件写入测试\n)# 第二步异步读取文件内容再次使用async_file_managerasyncwithasync_file_manager(test_file_path,moder)asf:contentawaitf.read()print(\n 文件内容)print(content)# 4. 运行异步主函数if__name____main__:asyncio.run(main())四、关键细节解析异步生成器函数的结构asynccontextmanager装饰的函数必须满足用async def定义异步函数包含且仅包含一个yield关键字分割「资源获取」和「资源释放」逻辑yield之前的代码在进入async with时执行对应__aenter__负责获取 / 初始化资源yield之后的代码在离开async with时执行对应__aexit__通常放在finally块中确保无论是否发生异常如文件读写报错都能释放资源async with的使用语法asyncwith异步上下文管理器(参数)as资源变量:# 操作资源支持await异步操作await资源变量.xxx()异常处理可选扩展asynccontextmanagerasyncdefasync_file_manager(file_path:str,mode:strr,encoding:strutf-8):file_handleNonetry:file_handleawaitaiofiles.open(file_path,modemode,encodingencoding)print(f✅ 异步打开文件{file_path}模式{mode})yieldfile_handle# 此处抛出的异常会被传递到async with代码块exceptExceptionase:print(f❌ 操作文件出错{e})raise# 可选重新抛出异常让调用方处理finally:iffile_handle:awaitfile_handle.close()print(f❌ 异步关闭文件{file_path})五、扩展场景FastAPI 异步生命周期管理asynccontextmanager在 Web 框架中应用广泛例如 FastAPI 中用于管理应用的异步生命周期fromfastapiimportFastAPIfromcontextlibimportasynccontextmanagerimportasyncio# 定义异步生命周期管理器asynccontextmanagerasyncdefapp_lifespan(app:FastAPI):# 应用启动时初始化异步资源如异步数据库连接池print( FastAPI应用启动初始化异步资源...)awaitasyncio.sleep(1)# 模拟异步初始化操作yield# 应用运行中传递控制权# 应用关闭时清理异步资源如关闭数据库连接池print( FastAPI应用关闭清理异步资源...)awaitasyncio.sleep(1)# 模拟异步清理操作# 传入生命周期管理器创建FastAPI应用appFastAPI(lifespanapp_lifespan)# 定义接口app.get(/)asyncdefroot():return{message:Hello, FastAPI asynccontextmanager!}