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

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. 万象客户端设置服务端ip保存在注册表的位置

    HKEY_LOCAL_MACHINE\SOFTWARE\Sicent\wx2004Clt 这个注册表被保护了,不能修改和删除,但可以在安全模式操作.

  2. ajax请求后根据条件进行页面跳转

    $.ajx({ url: "@Url.Action("DetectCorporationCompetencyCreated", "DataBase") ...

  3. Add Binary <leetcode>

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  4. MongoDB-JAVA-Driver 3.2版本常用代码全整理(1) - 增删改

    MongoDB的3.x版本java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  5. Spring 定时执行任务

    好不容易写了半天的文章竟然由于断网而丢失了,并未自动保存到草稿箱.只能简单的贴贴代码了. <?xml version="1.0" encoding="UTF-8&q ...

  6. java1.7集合源码阅读:LinkedList

    先看看类定义: public class LinkedList<E> extends AbstractSequentialList<E> implements List< ...

  7. quartus ii13.0~16.0 调用uedit (转载http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html)

    转自 http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html Quartus II 中的文本编辑软件不好用,比较习惯与UE(Uedit32/ultra ...

  8. No module named yum错误的解决办法

    今天用yum安装软件的时候出现如下错误: There was a problem importing one of the Python modules required to run yum. Th ...

  9. MapReduce --全排序

    MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...

  10. log4net记录日志到数据库自定义字段

    假设数据库中有如下自定义字段:   1.根据自定义字段定义日志信息对象     public class MessageLog     {           /// <summary> ...