首页 > 编程语言 >Python如何创建异步上下文管理器

Python如何创建异步上下文管理器

时间:2024-10-11 19:18:53浏览次数:12  
标签:异步 resource name Python async 管理器 上下文

异步上下文管理器的主要作用和使用场景:

  1. 主要作用:
    1. 自动管理异步资源的获取和释放
    2. 确保异步操作的正确完成和清理
    3. 简化异步代码的错误处理
    4. 提供更清晰、更简洁的异步代码结构
  2. 常见使用场景:
    1. 数据库连接管理
      1. 自动处理异步数据库连接的打开和关闭
      2. 确保在操作完成后正确释放连接资源
    2. 网络请求会话
      1. 管理HTTP客户端会话
      2. 确保网络连接的正确关闭
    3. 文件操作
      1. 异步文件的打开和关闭
      2. 确保文件句柄的正确释放
    4. 锁和信号量管理
      1. 在并发编程中自动获取和释放锁
      2. 管理资源访问控制
  3. 实现方式:
    1. 通过定义 __aenter____aexit__ 方法
    2. 使用 @asynccontextmanager 装饰器
  4. 优势:
    1. 代码更加简洁易读
    2. 自动处理资源释放,减少资源泄露
    3. 提供统一的异常处理机制

使用建议:
1. 当需要管理异步资源的生命周期时,优先考虑使用异步上下文管理器
2. 对于可能抛出异常的异步操作,异步上下文管理器可以确保资源正确释放
3. 在处理网络连接、数据库操作等场景时,异步上下文管理器特别有用

上下文管理器的调用者和异步函数之间的来回调用,我们可以创建一个简单的示例,使用 @asynccontextmanager 创建一个异步上下文管理器,并展示它在上下文进入和退出时的行为。

下面是一个简单的示例,展示了如何使用 @asynccontextmanager 创建一个异步上下文管理器,以及它在上下文管理器内外的调用顺序。

示例代码

import asyncio
from contextlib import asynccontextmanager

class Resource:
    def __init__(self, name):
        self.name = name

    async def acquire(self):
        print(f"Acquiring resource {self.name}")
        await asyncio.sleep(1)  # 模拟异步操作

    async def release(self):
        print(f"Releasing resource {self.name}")
        await asyncio.sleep(1)  # 模拟异步操作

@asynccontextmanager
async def manage_resource(name):
    resource = Resource(name)
    await resource.acquire()  # 上下文进入时的操作
    try:
        yield resource  # 暂停并等待上下文管理器内的代码执行
    finally:
        await resource.release()  # 上下文退出时的操作

async def main():
    async with manage_resource("my_resource") as res:
        print(f"Using resource {res.name}")
        await asyncio.sleep(2)  # 模拟异步操作

# 运行异步 main 函数
asyncio.run(main())

运行结果

Acquiring resource my_resource
Using resource my_resource
Releasing resource my_resource

代码解析

  1. 定义 **Resource**
    这个类有两个方法:acquirerelease,分别模拟获取和释放资源的异步操作。
  2. 创建异步上下文管理器
@asynccontextmanager
async def manage_resource(name):
    resource = Resource(name)
    await resource.acquire()  # 上下文进入时的操作
    try:
        yield resource  # 暂停并等待上下文管理器内的代码执行
    finally:
        await resource.release()  # 上下文退出时的操作

这个上下文管理器在进入时调用 acquire 方法获取资源,并在退出时调用 release 方法释放资源。

  1. 使用上下文管理器
async def main():
    async with manage_resource("my_resource") as res:
        print(f"Using resource {res.name}")
        await asyncio.sleep(2)  # 模拟异步操作

main 函数中,使用 async with 语句来管理资源。在上下文内部,资源被正确获取并使用,在退出时资源被正确释放。

总结

这个示例展示了如何使用 @asynccontextmanager 创建一个异步上下文管理器,并展示了在上下文管理器内部和外部的调用顺序。通过这种方式,可以确保在异步代码中正确管理资源的获取和释放。

标签:异步,resource,name,Python,async,管理器,上下文
From: https://blog.csdn.net/budahui/article/details/142833623

相关文章

  • 基于python的电影票房预测系统设计与实现(论文+源码)_kaic
    基于python的电影票房预测系统设计与实现摘 要近些年来,随着电影行业变得越来越热门,也为影院带来不小的票房收入。传统的影院都是依靠个人经验进行排片,但是由于影片的票房收入可能受多种因素的影响,排片多的电影最后的票房会远低于预期值,导致影院因安排失误而导致大量的票房......
  • 几近破产!Python协会丑闻惊了整个社区:49万元被挪用仅剩183元
    ​10月9日消息,据媒体报道,一直以来致力于在新西兰推广Python的非营利性协会PythonNewZealand(PythonNZ),近期爆出财务丑闻震惊了整个社区。协会财务主管CarlosBavastrelloCordero在近5年的时间里,私自挪用了高达7万美元(约合人民币49万元)的资金,被发现时账户里只剩下26美元(约合人......
  • Python截图OCR+鼠标拖拽实现小猿口算比大小自动答题
    我的第一个python项目importtimeimportpyautoguifromPILimportImagefrompaddleocrimportPaddleOCRActOCR=PaddleOCR()whileTrue:#获取指定坐标的截图defcapture_screenshot_at_coordinates(x1,y1,x2,y2):#获取整个屏幕的截图......
  • Python从0到100(六十二):机器学习实战-预测波士顿房价
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • 基于yolov8、yolov5的果蔬检测系统(含UI界面、数据集、训练好的模型、Python代码)
    项目介绍项目中所用到的算法模型和数据集等信息如下:算法模型:  yolov8、yolov8+SE注意力机制或yolov5、yolov5+SE注意力机制,直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有GPU,无法自行训练。数据集:  网上下载的数据集,格式都已......
  • 简易学生信息管理系统(Python版)
    一、系统简介实现一个学生信息的管理系统:主要功能有:添加学生信息删除学生信息修改学生信息查询学生信息显示学生信息退出当前系统二、步骤分析显示功能界面用户输入功能序号对不同序号的功能实现具体函数(3.1定义函数、3.2调用函数)三、需求实现显示......
  • Python办公软件自动化,5分钟掌握openpyxl操作
    今天给大家分享一篇用openpyxl操作Excel的文章。各种数据需要导入Excel?多个Excel要合并?目前,Python处理Excel文件有很多库,openpyxl算是其中功能和性能做的比较好的一个。接下来我将为大家介绍各种Excel操作。如果你正在学习Python并且找不到方向的话可以试试我这一份学习方法......
  • python 流程控制
    流程控制(一)条件控制if语句每条if语句的核心都是一个值为True或False的表达式,这种表达式称为条件测试。Python根据条件测试的值是True还是Flase来决定是否执行if语句中的代码。如果条件测试为True,Python就执行紧跟在if语句后的代码;如果为False,python就忽略......
  • Python中key参数的含义及用法
    我们在使用sorted()或map()函数的时候,都会看到里面有一个key参数其实这个key参数也存在于其他内置函数中(例如min()、max()等),那么我们今天就来了解一下key参数的含义以及用途吧!sorted()中的key我们来看下面这段代码:some_numbers=[3.14159,2.71828,......
  • Python多进程中并行编程与进程池
    Python的并行编程可以采用multiprocessing或mpi4py模块来完成。multiprocessing是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器核心的进程能读取共享内存。在基于共享内存通信的多进程编程中,常常通过加锁或类似机制来实现互斥。mpi4py库实现了消息传......