• Yolo v8中的上下文管理器


    1. from contextlib import contextmanager
    2. @contextmanager
    3. def torch_distributed_zero_first(local_rank: int):
    4. # Decorator to make all processes in distributed training wait for each local_master to do something
    5. if local_rank not in [-1, 0]:
    6. dist.barrier(device_ids=[local_rank])
    7. yield
    8. if local_rank == 0:
    9. dist.barrier(device_ids=[0])
    10. with torch_distributed_zero_first(rank):
    11. dataset = LoadImagesAndLabels(path)

           通过上下文管理器以便使用with语句。使用 contexlib 模块中的 @contextmanager 装饰器。上下文管理器通过with语句来自动获取和释放资源,确保资源的正确管理和关闭,避免资源泄露和错误。

           上下文管理器中有__enter__()和__exit__()俩个特殊方法。__enter__()方法在with语句块执行前调用,负责获取资源并返回资源对象。__exit__()在with语句执行完调用,负责资源的释放。

    创建上下文管理器有两种方法:

    (1)通过函数装饰器创建,使用 contexlib 模块中的 @contextmanager 装饰器。

    1. from contextlib import contextmanager
    2. @contextmanager
    3. def my_context():
    4. try:
    5. print('Entering the context') # 获取资源,例如打开文件、建立数据库连接等
    6. yield # yield语句之前的代码相当于__enter__()方法
    7. # yield语句之后的代码相当于__exit__()方法# 使用函数装饰器创建上下文管理器
    8. except Exception as e:
    9. print(f'An exception of type {type(e)} occurred with value {e}')
    10. finally:
    11. print('Exiting the context') # 释放资源,例如关闭文件、关闭数据库连接等
    12. with my_context():
    13. print('Inside the context') # 在这里使用资源进行操作

    运行结果:

            装饰器修饰my_context()函数使它成为一个上下文管理器。yield语句用于指示资源的获取及释放,允许在with语句中使用资源。

    (2)通过类创建

    1. class MyContent:
    2. def __enter__(self):
    3. print('Entering the content') # 获取资源,例如打开文件等
    4. return self
    5. def __exit__(self, exc_type, exc_val, exc_tb):
    6. print('Exiting the content') # 释放资源,例如关闭文件
    7. if exc_type is not None:
    8. print(f'An exception of type {exc_type} occurred with value {exc_val}')
    9. return False # 返回False表示不处理异常,异常会继续传播
    10. # 使用自定义的上下文管理器
    11. with MyContent() as my_content:
    12. print('Inside the content') # 在这里使用资源对象进行操作print('Outside the context')

    Mycontent()是一个自定义的上下文管理器。__enter__()方法返回self自身作为资源对象。__exit__()在with语句执行完之后被自动调用,释放资源

    上下文管理器的使用:具备上下文管理器之后,可以直接使用with语句管理资源的获取和释放。

    with 上下文管理器 as 资源对象:

            对资源对象的操作

           with语句开始执行时,会先调用__enter__()方法中的内容用于获取资源,这一部分可以进行资源对象的操作。with执行完毕之后,无论是否发生异常,都会被调用用于释放资源。

    1. class FileHandler:
    2. def __init__(self, filename, mode):
    3. self.filename = filename
    4. self.mode = mode
    5. # 打开文件并返回文件对象,可以直接使用file对象进行文件的读取操作
    6. def __enter__(self):
    7. self.file = open(self.filename, self.mode)
    8. return self.file
    9. # with执行完毕,调用__exit__()关闭文件
    10. def __exit__(self):
    11. self.file.close()
    12. # 上下文管理器
    13. with FileHandler('file.txt', 'r') as file: #
    14. content = file.read()
    15. print(content) # __exit__()中关闭文件

  • 相关阅读:
    经典Mysql入门必刷50题及全网最新最详细的笔记记录
    SpringBoot 学习(四)数据库整合
    【机器学习】特征工程之特征选择
    从零开始:使用低代码平台开发OA系统的教程
    苹果电脑Mac系统运行速度又卡又慢是怎么回事?
    三十四、数学知识——约数(试除法 + 约数个数 + 约数之和 + 欧几里得算法)
    IDC:云效产品能力No.1,领跑中国DevOps市场
    C#-文件读写
    GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 & 获取面的坐标数据信息框进行展示 & 渲染图片的两种方式
    51万奖池邀你参战——第二届阿里云ECS CloudBuild开发者大赛来袭
  • 原文地址:https://blog.csdn.net/laner__gg/article/details/133039378