• 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__()中关闭文件

  • 相关阅读:
    屏幕状态自动检测+鼠标自动操作
    中序和后序遍历构建二叉树[递归划分区间与回溯拼接子树+中后序和中前序的相似与不同]
    【洛谷】P2661 信息传递
    【每日一题】数据流中的中位数
    API之 要求接口上传pdf 以 合同PDF的二进制数据,multpart方式上传
    Day:动态规划 LeedCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
    程序员这样提高英语,少走很多弯路
    从物联网到元宇宙 京东方在创新中迸发“增长韧性”
    基于JavaSwing开发餐厅点餐系统(购物,购物车,订单) 课程设计 大作业源码 毕业设计
    王怀远:阿里云一站式物联网存储架构设计
  • 原文地址:https://blog.csdn.net/laner__gg/article/details/133039378