写过多线程程序的人肯定对各种锁很熟悉,尤其是下面这种代码

def lock_usage:
lock.Lock()
if(...) :
lock.Unlock()
return lock.Unlock()
return

为了避免造成死锁,需要在每个return语句之前都释放锁。像上面的代码中,如果代码的执行路径很多,代码中就会包含大量的unlock语句,代码混乱还是小事儿,如果万一忘掉了unlock,就是个潜在的危险。除了锁之外,包括文件描述符的关闭等涉及到资源释放的操作都会有这种问题。
为了解决内存泄漏的内存问题,现代的编程语言提供了垃圾回收机制。同样为了解决上面这种有限资源的释放问题,很多语言都提供了一些语法特性。Python有with语句,C#有using,Go有defer。

先看解决这种问题的常规做法,使用finally

try:
lock.Lock()
......
except:
prcess_except()
finally:
lock.Unlock

这么写使得代码很乱,尤其是当......处的代码也包含有类似代码时,会使得代码更加混乱。再来看使用with语句后的代码

class LockContext(object):
__init__(self, lock):
self.lock = lock __enter__(self):
self.Lock() __exit__(self, type, value, traceback):
if type != None:
process_except()
self.Unlock()
return false with LockContext(lock) as lock:
.......

这样写出来,代码量虽然差不多,但是结构清晰了很多。在上面的代码中__init__中的赋值是可选的,只要保证能够访问到所需的变量就可。

Python中的with语句中要求对象实现__enter__和__exit__函数。调用with语句时,会先分析该语句,执行__enter__函数,然后在当前suite退出时,会调用__exit__函数。__exit__函数中除了可以做释放资源的操作之外,同时也是异常处理的地方。如果当前suite正常退出,没有抛出任何异常,__exit__的几个参数均为None。否则,则将此异常的type、value、traceback作为参数传递给__exit__函数,同时,如果__exit__返回false,此异常会再次抛出,上一级代码suite可以继续处理,如果__exit__返回true,那么此异常就不会被再次抛出了

Python的with语句的更多相关文章

  1. 理解python的with语句

    Python’s with statement provides a very convenient way of dealing with the situation where you have ...

  2. Python之with语句

    Python之with语句 在Python中,我们在打开文件的时候,为了代码的健壮性,通常要考虑一些异常情况,比如: try: ccfile = open('/path/data') content ...

  3. (Python )控制流语句if、for、while

    这一节,我们将学习Python的控制流语句,主要包括if.for.while.break.continue 和pass语句 1. If语句 if语句也许是我们最熟悉的语句.其使用方法如下: x=inp ...

  4. Python学习教程(learning Python)--3.3.4 Python的if-elif-else语句

    Python的if-elif-else语句用于多种条件判断后选择某个语句块执行.该语句可以利用一系列条件表达式进行检查,并在某个表达式为真的情况下执行相应的代码.需要注意的是,虽然if/elif/el ...

  5. 转: 理解Python的With语句

    Python’s with statement provides a very convenient way of dealing with the situation where you have ...

  6. python的with语句,超级强大

    With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...

  7. 简单探讨python中的语句和语法

    python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句 ...

  8. python assert 断言语句的作用

    python assert 断言语句的作用 assert语句的应用场景 使用assert语句是一个很好的习惯. 我们在编写代码的时候, 不知道程序会在什么时候崩溃, 与其让它在深度运行时崩溃, 不如预 ...

  9. Python: 没有switch-case语句

    初学Python语言,竟然很久才发现Python没有switch-case语句 官方的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句 ...

随机推荐

  1. 29、shiro框架入门

    1.建立测试shiro框架的项目,首先建立的项目结构如下图所示 ini文件 中的内容如下图所示 pom.xml文件中的内容如下所示 <project xmlns="http://mav ...

  2. 解决OneNote的无法同步的问题

    微软的OneNote一直是我比较喜欢的笔记软件,一些复杂的笔记用它来存储比Evernote要强大很多,然而这几天发现一直无法同步,登陆https://onedrive.live.com/看了一下,发现 ...

  3. linux进程及进程控制

    Linux进程控制   程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...

  4. malloc()参数为0的情况

    问题来自于<程序员面试宝典(第三版)>第12.2节问题9(这里不评价<程序员面试宝典>,就题论题): 下面的代码片段输出是什么?为什么? char *ptr; ))==NULL ...

  5. 添加和删除hadoop集群中的节点

    参见 http://www.cnblogs.com/tommyli/p/3418273.html

  6. java.lang.UnsupportedClassVersionError: xxx/xxxClass : Unsupported major.minor version 51.0

    完全参考自 http://www.cnblogs.com/xing901022/p/4172410.html 这种错误的全部报错信息: 1 java.lang.UnsupportedClassVers ...

  7. RabbitMQ 学习记录

    rabbit mq知识点:1.消费时可以通过acknowledge设定消费是否成功,消费不成功时在server端requeue2.需要注意两个持久化:queue持久化和消息持久化(通过代码设定,默认即 ...

  8. css 层的嵌套

    html <div class="menu"> <ul> <li><a class="li1" title=" ...

  9. Open Live Writer的配置

    --------siwuxie095 1.首先到官网下载OLW:http://openlivewriter.org/ 2.选择 Other services 3.填写"博客地址". ...

  10. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...