0

0

Python 异步上下文管理器的实现方式

冷炫風刃

冷炫風刃

发布时间:2026-01-18 18:51:08

|

572人浏览过

|

来源于php中文网

原创

Python异步上下文管理器需实现__aenter__和__aexit__两个async方法,用于异步资源获取与清理;支持async with语法,不可在同步函数中使用,且不能与同步上下文管理器混用。

python 异步上下文管理器的实现方式

Python 异步上下文管理器通过 async with 语句使用,其核心是实现 __aenter____aexit__ 两个异步方法,二者都必须是协程函数(用 async def 定义)。

基本实现结构

一个合法的异步上下文管理器类需满足:

  • __aenter__ 返回进入上下文时的值,可以是任意对象(包括协程结果),通常用于异步资源获取(如打开网络连接、数据库会话)
  • __aexit__ 接收异常三元组 (exc_type, exc_value, traceback),返回 True 表示已处理异常、不向外传播;返回 NoneFalse 则异常继续传播
  • 两个方法都必须用 async def 声明,不可用 await 普通生成器或同步方法模拟

完整可运行示例

以下是一个模拟异步文件读取的简单异步上下文管理器:

import asyncio

class AsyncFile: def init(self, path): self.path = path self._file = None

async def __aenter__(self):
    # 模拟异步打开:实际中可能是 aiofiles.open()
    await asyncio.sleep(0.1)
    self._file = f"Async file handle for {self.path}"
    return self._file

async def __aexit__(self, exc_type, exc_value, traceback):
    # 模拟异步关闭
    await asyncio.sleep(0.05)
    self._file = None
    # 若有异常,可在此记录或抑制
    if exc_type is not None:
        print(f"Exception caught: {exc_type.__name__}: {exc_value}")
    return False  # 不抑制异常,让调用方感知

使用方式

async def main(): async with AsyncFile("data.txt") as f: print("Inside context:", f)

raise ValueError("test error") # 可取消注释测试异常处理

asyncio.run(main())

配合 asynccontextmanager 装饰器简化写法

对于简单逻辑,推荐使用 contextlib.asynccontextmanager,避免手动写类:

云商商城系统
云商商城系统

云商商城系统,即云商未来商城系统,云商商城系统提供完整的电子商务解决方案。云商商城系统集CMS、B2C、B2B2C、B2B、C2B、SNS用户社区于一体,包括网站商城、微信商城、手机商城等多种交易模式,支持实现不同模式的O2O电子商务平台。为企业树立企业品牌形象,实现独立网络推广,批发、零售,供应商加盟,并充分结合网站SEO、微博、APP,微信等移动客户端多渠道网络营销手段,实现线上线下统一管理,

下载

立即学习Python免费学习笔记(深入)”;

from contextlib import asynccontextmanager
import asyncio

@asynccontextmanager async def db_connection(): print("Connecting...") await asyncio.sleep(0.1) try: yield "DB connection object" finally: print("Disconnecting...") await asyncio.sleep(0.05)

使用

async def use_db(): async with db_connection() as conn: print("Using", conn)

asyncio.run(use_db())

装饰器将普通异步生成器自动转为异步上下文管理器:yield 前的部分对应 __aenter__yield 后(finally 中)对应 __aexit__ 的清理逻辑。

注意事项与常见误区

使用时需注意:

  • async with 只能在 async def 函数内使用,不能在同步函数或模块顶层直接写
  • __aenter____aexit__ 中若调用阻塞 I/O(如 time.sleep、普通 open()),会阻塞事件循环,应改用异步等价物(如 asyncio.sleepaiofiles.open
  • 异步上下文管理器不能替代同步版本(__enter__/__exit__),二者互不兼容;混用会导致 RuntimeError 或静默失败
  • 若需同时支持同步和异步(如库设计),需分别实现两套协议,或用适配层封装

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

759

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

762

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1265

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

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

共4课时 | 4.3万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

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