首页 > 其他分享 >上下文管理器

上下文管理器

时间:2024-12-21 12:52:31浏览次数:3  
标签:__ 异步 管理器 async 操作 上下文

异步上下文管理器(async with)和同步上下文管理器(with)的区别主要在于它们的工作方式与事件循环的配合。理解这一点可以帮助你更好地使用它们处理 I/O 操作,尤其是在异步编程中。以下是两者的主要区别:

1. 工作方式

  • 同步上下文管理器 (with)

    • 同步上下文管理器用于同步代码块,它会在进入 with 块时执行 __enter__ 方法,并在退出 with 块时执行 __exit__ 方法。
    • with 块中,所有操作是同步的,程序会按顺序执行,不会立即返回,直到 with 块中的代码执行完毕。
    • 示例:文件操作、数据库连接、线程锁等常见同步操作。
    with open('example.txt', 'r') as file:
        content = file.read()
    # 这里的代码是同步的,程序会等待文件操作完成才继续执行
    
  • 异步上下文管理器 (async with)

    • 异步上下文管理器用于异步编程,它同样具有 __enter____exit__ 方法,但是它们是异步的(使用 async def 定义),并且需要使用 await 来等待其完成。
    • 这意味着它适用于 I/O 密集型的操作,比如网络请求、数据库查询或文件操作等,它们可以并发执行,而不会阻塞事件循环。
    • 使用 async with 时,进入和退出上下文时的操作是异步执行的,因此它允许在等待 I/O 操作完成时执行其他任务。
    import aiofiles
    
    async with aiofiles.open('example.txt', 'r') as file:
        content = await file.read()
    # 这里的代码是异步的,程序会在等待文件操作时执行其他任务
    

2. 应用场景

  • 同步上下文管理器 (with)

    • 适用于执行一些需要阻塞等待的操作,比如读取文件、访问数据库或进行一些需要锁定资源的操作(如多线程中的锁)。
    • 在同步编程中,with 是非常常见的。
  • 异步上下文管理器 (async with)

    • 主要用于 I/O 密集型的操作,特别是当操作会导致等待(如网络请求、文件系统操作、数据库查询等)时。
    • 使用 async with 可以避免在等待 I/O 操作时阻塞主线程,从而提高程序的效率和响应性。
    • 例如,在 aiohttp(异步 HTTP 请求)或 aiofiles(异步文件操作)中,我们通常会使用 async with

3. 如何实现

  • 同步上下文管理器

    • 通过实现 __enter____exit__ 方法来定义上下文管理器的行为。

    示例:

    class MyContextManager:
        def __enter__(self):
            print("Enter")
            return self
        
        def __exit__(self, exc_type, exc_val, exc_tb):
            print("Exit")
            
    with MyContextManager() as manager:
        print("Inside the context")
    # Output:
    # Enter
    # Inside the context
    # Exit
    
  • 异步上下文管理器

    • 通过实现 __aenter____aexit__ 方法来定义异步上下文管理器的行为。

    示例:

    class MyAsyncContextManager:
        async def __aenter__(self):
            print("Async Enter")
            return self
        
        async def __aexit__(self, exc_type, exc_val, exc_tb):
            print("Async Exit")
            
    import asyncio
    
    async def main():
        async with MyAsyncContextManager() as manager:
            print("Inside the async context")
            
    asyncio.run(main())
    # Output:
    # Async Enter
    # Inside the async context
    # Async Exit
    

4. 性能差异

  • 同步上下文管理器

    • 在执行 I/O 操作时,程序会被阻塞,直到操作完成。例如,如果在文件读取过程中等待,整个程序将停下来,直到文件内容被读取完。
  • 异步上下文管理器

    • 异步上下文管理器允许你在等待 I/O 操作的同时,执行其他任务。对于大量 I/O 密集型操作,这会显著提高程序的效率,因为它避免了阻塞操作。

5. 常见使用库

  • 同步上下文管理器open(文件操作)、threading.Lock(线程锁)、sqlite3.connect(数据库连接)等。
  • 异步上下文管理器aiohttp.ClientSession(异步 HTTP 请求)、aiofiles.open(异步文件操作)等。

6. 总结

  • 同步上下文管理器with)适用于同步的、阻塞的操作,它等待一个操作完成后才进行下一个操作。
  • 异步上下文管理器async with)适用于异步编程,可以在等待 I/O 操作时允许程序执行其他任务,从而提高效率。

简而言之,选择 with 还是 async with,取决于你是在处理同步操作还是异步操作。在 I/O 密集型的异步场景下,推荐使用异步上下文管理器来避免阻塞。

标签:__,异步,管理器,async,操作,上下文
From: https://www.cnblogs.com/cloud-2-jane/p/18620661

相关文章

  • winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击
    winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭protectedoverridevoidWndProc(refMessagem){#region处理点击窗体标题栏放大缩小问题,禁用点击窗体标题栏放大缩小//logger.Info($"{m.Msg}");......
  • OpenCL 编程步骤 3. 获取Context 上下文
    转载https://deepinout.com/opencl/opencl-basic-tutorials/opencl-create-context.html上下文为关联的设备、内存对象、命令队列、程序对象、内核对象提供一个容器。上下文是OpenCL应用的核心。正是上下文驱动着应用程序与特定设备以及特定设备之间的通信。对于上下文中关联的......
  • Linux 定时任务操作详解及python简单的任务管理器
    Linux定时任务操作在Linux中,定时任务操作主要通过cron工具来实现。cron是一个基于时间的作业调度器,允许用户在指定的时间或周期内执行预定的任务。1.查看当前用户的定时任务使用crontab命令查看当前用户的定时任务:crontab-l2.编辑定时任务使用crontab-e......
  • 深入理解NPM:Node.js的包管理器
    在现代Web开发中,Node.js已经成为不可或缺的工具之一。它不仅简化了JavaScript在服务器端的执行过程,还提供了丰富的模块系统和包管理工具。而NPM(NodePackageManager)作为Node.js的官方包管理器,更是让开发者能够轻松地安装、管理和更新各种功能模块。本文将详细探讨NPM的核心......
  • 在LESS中如何定义变量上下文中的范围?
    在LESS中,变量的作用范围是其被声明的位置和该位置之后的所有区域,直到被另一个同名的变量声明覆盖。LESS没有提供类似于其他编程语言中的块级作用域或函数作用域的概念。然而,你可以通过一些技巧来模拟变量的“局部”作用域。在混合(Mixin)中定义变量:在LESS中,你可以在混合中定义变量......
  • Windows系统-Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法
    Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法文章目录Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法获取资源管理器路径方法运行错误打开控制台到指定路径方法打开资源管理器到指定路径方法闲着没事还开发了个......
  • 《Java核心技术I》Swing布局管理器
    布局管理概述Java开发环境提供了GUI生成器,但要弄清底层原理,也需要手动调整。布局管理器回顾之前程序,按钮包含在JPanel中,用流布局管理器(flowlayoutmanager)管理。自动换行,按钮总是位于面板中央。组件放在容器中,布局管理器绝定容器组件的位置和大......
  • macOS / Windows / Linux:FlyEnv (PhpWebStudy) —— 一站式 Web 服务器和开发环境管理
    FlyEnv是什么?FlyEnv是一款集成了Web服务器、数据库服务器和开发环境管理的GUI应用程序。它提供了一整套完整的运行环境,帮助用户开发和调试Laravel、WordPress、Yii2、ThinkPHP、FastAdmin、NestJS、SpringBoot、Gin、Beego、Django、Flask等PHP、NodeJS、Java、Go......
  • ProcessExplorer 多功能任务管理器软件-中文绿色单文件版
    今天我和大家分享一款系统监控工具——ProcessExplorer。一个比Windows自带的任务管理器更强大的工具。感觉最实用的是他的搜索功能,可以搜到系统任务管理器里面无法显示的应用,大家可以网上走索下载,也可以通过这个链接下载:https://www.itlooker.cn/archives/6204ProcessExplore......
  • Day46--3种布局管理器
    Day46--3种布局管理器必备的英语:hgaphorizontalgap水平间距horizontaladj.水平的vgapverticalgap垂直间距verticaladj.垂直的button的用法;“label”......