Python 上下文管理器

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

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

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

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

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

logger = open("log.txt", "w")
try:
    logger.write('Hello ')
finally:
    logger.close()
print logger.closed

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

3.使用上下文管理器

with open("log.txt", "w") as logger:
    logger.write('Hello ')
    logger.write('World')

print logger.closed

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

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

sess = tf.Senssion()
sess.run()
sess.close()

而使用上下文管理器后:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言并发与并行学习笔记

Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make...

3575
来自专栏Java成长之路

Java内存模型

多任务处理在现代计算机操作系统中几乎已经是一项必备的功能了。计算机cpu的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或...

521
来自专栏杨建荣的学习笔记

关于连续登录的问题探究

经常会在数据统计中取筛选连续性的数据,比如筛选连续三个月都登录的用户, 数据形式如下: 1 111 222 333 2 111 3 111 222 4 111 ...

34112
来自专栏web前端教室

vue.js的computed计算属性,表达式的“js另存为”

简单的讲,vue的模板是基于html的,就是html里加模板语法,所以模板里的js注定不能太复杂。如果业务逻辑很复杂,就不能放在模板里了,否则这模板就成了一个业...

1816
来自专栏wym

面向连接的c语言/socket 程序流程(TCP)

   int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

782
来自专栏java系列博客

深入理解Java内存模型(三)——顺序一致性

1262
来自专栏java一日一条

Java接口回调机制详解

最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下。

492
来自专栏ImportSource

并发编程-加锁机制

本文翻译自《Java Concurrency ?In ?Practice》,定期放送 ,让你利用碎片时间悄悄的看了一本书! 我们的文章是系列的。所以先请允许...

2888
来自专栏高性能服务器开发

libevent源码深度剖析(六) 初见事件处理框架

(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基...

1082
来自专栏水击三千

SQL语言学习-数据操纵语言

一般而言,数据库中数据的生命周期包括数据插入以及更新、数据删除3个阶段。首先需要用户或者系统将数据插入表。然后,对数据的使用,包括数据的检索以及数据的更新。最后...

28010

扫码关注云+社区