上下文管理器

news/2024/12/21 12:55:05/文章来源:https://www.cnblogs.com/cloud-2-jane/p/18620661

异步上下文管理器(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 aiofilesasync 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 selfdef __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 selfasync def __aexit__(self, exc_type, exc_val, exc_tb):print("Async Exit")import asyncioasync 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 密集型的异步场景下,推荐使用异步上下文管理器来避免阻塞。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sunny替换响应体

本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18620658

AuthBy pg walkthrough Intermediate window

nmap └─# nmap -p- -A -sS 192.168.226.46 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-21 01:01 UTC Stats: 0:01:06 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 52.12% done; ETC: 01:04 (0:01:00 rem…

学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结

学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业…

纪念 Jonathan Barzilai

我在读博期间研究了关于非线性优化算法中的Barzilai-Borwein(BB)步长。正如我的导师安老师所言:梯度下降法是优化算法的基石(只考虑一般可微的目标函数)。在该算法中,迭代点每次沿着当前的负梯度方向"走一步",一直迭代下去,逼近最优解(当然是局部的)。一个自然地…

省选数学专题

昌吉市传教士出金身难度升序排序(大概吧)。 [AGC016C] +/- Rectangle 签,虽然国集作业。 贪心是显然的,不说了,这里只考虑正数如何填。 如果\(H\times W-\left\lfloor\frac{H}{h}\right\rfloor\times h\times \left\lfloor\frac{W}{w}\right\rfloor\times w\le \left\lflo…

《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验

第四十五章 人脸识别实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/A…

【寒武纪mlu220模型移植】(一)目标检测YoLoV8

前言:目标检测可能是大家用的比较多的,先完善这一篇吧。yolov5的导出可以参考官方文档。并且博主比较懒,已经做过一遍的事情,不想验证第二遍,如果有步骤错误或者疏漏导致中间遇到了问题,可以先自己debug,流程大致就是这样的。 一、修改源码首先是拉取yolov8最新的源码,…

基于钜泉计量AD的电表应用专题推荐(ATT7053D、HT7136、HT7627S-E

关于电力仪表上应用专题介绍,钜泉电能计量、PA驱动、Flash存储HiTrend(钜泉)电能计量芯片 单相计量ADC:ATT7053D,ATT7053C,HT7017,HT7017C 三相计量ADC:HT7036、HT7038、ATT7022E、HT7136、HT7132、HT7032-L 单相计量SOC:HT5019、HT5017,HT5025、HT5029,HT5033,HT503…

AI视频抠图来了!还可以替换视频背景,附下载链接

虽然人工智能正在飞速发展中,图像处理技术也在不断升级,但视频背景去除一直都是图像处理任务中最具挑战性的难题之一 Clipper是一款专注于高精度图像分割的AI工具,用于图像和视频的背景去除,允许用户直接输出透明背景(自定义颜色)的视频文件,还提供用一张图片或者其它视…

习题10.3

import numpy as np import statsmodels.formula.api as smf import matplotlib.pyplot as plt# 加载数据 a = np.loadtxt(data10_3.txt)# 设置绘图参数 plt.rc(text, usetex=True) # 启用 LaTeX 字体 plt.rc(font, size=16) # 设置字体大小 plt.style.use(default) # 使用默…

浅谈一下本机、服务器、docker-compose 容器之间网络通信

一、首先,先区分四个对象,它们分别有自己的网络 1、云服务器上,应用服务容器网络(app,nginx,mysql,redis等)app.net 2、云服务器上,模型服务容器网络(ai服务) 模型网络 ai.net 3、云服务器上:宿主机网络(服务器本机) 服务器本机网络 host.net 4、本机:本地网络 loca…

习题10.1

import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt def check(data): # 提取数据的第一列和第二列 x = data[:, 0] y = data[:, 1] # 使用statsmodels进行线性回归分析 model = sm.OLS(y, sm.add_constant(x)).fit() # 添加常数项 print(mode…