Python 上下文管理器

谁借莪1个温暖的怀抱¢ 2022-06-15 10:00 289阅读 0赞

TensorFlow的运行模型—session(会话),用来执行定义好的运算,会话拥有并管理TensorFlow程序运行时的所有资源,所以当运算结束后需要对资源回收,否则可能会出现资源泄漏的问题。当然我们是可以通过关闭会话的方式回收资源,还有一种更为简便的方式就是使用Python的上下文管理器。
在说明TensorFlow的会话操作之前,先介绍上下文管理器和它的一个其他使用。
在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作(如打开文本);当语句块执行完成后,需要继续执行一些收尾动作(如收回资源)。这就好比OpenCV1.0版本时,我们在开头定义了一个IplImage类型的变量,总要在程序结束前 cvReleaseImage它,不然就会造成内存的泄漏,而这也是1.0版本的一个很大的诟病,直到2.0版之后引入了Mat类型,而Python的上下文管理器就相当于Mat类型,不需要在最后手动收回,不需要考虑代码异常情况下的资源收回。(这个例子可能并不准确,但是可以直观的说明上下文管理器的最大优点:简便的内存管理,异常下的内存回收)

下面举一个简单的例子,比如我们想要完成一个文件写入的任务:
1.用手动收回的方式:

  1. logger = open("log.txt", "w")
  2. logger.write('Hello ')
  3. logger.close()
  4. print logger.closed

就像这样,当代码执行到logger.close()时会关闭之前打开着的txt文件,但是这样就会出现一个问题,如果代在logger.close()前就出现了异常,那么就没办法完成回收工作,所以我们也可以考虑用try-finally语句。

2.加入try-finally并手动收回

  1. logger = open("log.txt", "w")
  2. try:
  3. logger.write('Hello ')
  4. finally:
  5. logger.close()
  6. print logger.closed

try-finally就像C++中的try/catch异常捕获机制一样,即使出现异常,也能保证关闭文件句柄。但是这样的方式还是要麻烦一些。

3.使用上下文管理器

  1. with open("log.txt", "w") as logger:
  2. logger.write('Hello ')
  3. logger.write('World')
  4. print logger.closed

是的,只需要在程序块前加上with,就可以实现上下文管理器的功能,比方法2简洁了很多。但是需要说明的是with仅能工作于支持上下文管理协议(context management protocol)的对象。
我们可以通过可以直接通过内建函数dir()来查看对象支持的方法和属性,如果其中包含了'__enter__', '__exit__',即支持上下文管理协议。

最后说回TensorFlow的会话操作,手动收回资源的方式就是关闭会话:

  1. sess = tf.Senssion()
  2. sess.run()
  3. sess.close()

而使用上下文管理器后:

  1. with tf.Senssion() as sess:
  2. sess.run()

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python上下文管理

    1. 上下文管理器 一个类只要实现了 `__enter__()` 和 `__exit__()` 这个两个方法,通过该类创建的对象我们就称之为上下文管理器。 上下文管理器

    相关 python上下文管理

    上下文管理器允许你在有需要的时候,精确地分配和释放资源。 使用上下文管理器最广泛的案例就是`with`语句了。 想象下你有两个需要结对执行的相关操作,然后还要在它们中间放

    相关 Python深入 上下文管理

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分