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 条评论
登录 后参与评论

相关文章

来自专栏王亚昌的专栏

路由查找算法优化心得

    项目代码中有一个基础类库,用于解析client到server的路由配置文件,同时管理长连接。路由配置文件格式大致如下所示:

762
来自专栏Golang语言社区

Go语言中的管道(Channel)总结

管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。...

3506
来自专栏Java技术

面试必备技能:JDK动态代理给Spring事务埋下的坑!

最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,...

793
来自专栏aCloudDeveloper

UNIX环境高级编程笔记之进程控制

  本章重点介绍了进程控制的几个函数:fork、exec族、_exit、wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的...

18210
来自专栏编程

Spring-Data-REST轻松搞定RESTfulAPI

背景 昨天同事问我有没有研究过 ,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 ,过一会发过两个截图过来。真的很强大,感觉这个在使用...

2346
来自专栏我的博客

坑爹的serialize和unserialize

今天项目当中遇到一个奇葩的问题,无法返序列化!!!! a:2:{s:9:”condition”;s:0:”;s:5:”value”;  这是其中的一段字符串! ...

2634
来自专栏Python

【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理

1592
来自专栏大内老A

WCF技术剖析之十一:异步操作在WCF中的应用(上篇)

按照操作执行所需的资源类型,我们可以将操作分为CPU绑定型(CPU Bound)操作和I/O绑定型(I/O Bound)操作。对于前者,操作的执行主要利用CPU...

1867
来自专栏小灰灰

Java并发学习之Volatile及内存模型探究

volatile工作原理 java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言...

1909
来自专栏大前端_Web

解析Web Workers

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

662

扫码关注云+社区