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

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. 返回记录结构时,如果需要返回为nil时 应该怎么办。

  2. 8.1H5学习笔记

    内嵌框架 说明: 属性 属性值 说明 width px,% 指定框架的宽度 height px,% 指定框架的高度 scrolling yes,no,auto 是否显示滚动条 frameborder ...

  3. JavaWeb总结--Servlet 工作原理解析

    从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...

  4. CLR VIA C#事件

    事件是类型的一个成员,用来在事情发生的时候通知注册了该事件的成员. 事件和观察者模式十分的相似,所以事件应该提供如下几种能力 1.能让对象的方法登记对他的关注 2.能让对象的方法取消对他的关注 3.能 ...

  5. Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作

    Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作          博客分类: vb2005xu软件学习 OSApache防火墙PHPWindows  日志如下:[ ...

  6. [转] Python包和类的基本用法

    http://blog.csdn.net/liukang325/article/details/46724365 建立一个文件夹filePackage 在filePackage 文件夹内创建 __in ...

  7. 安装mysql5.5时候的报错解决办法:

    每次安装mysql5.5的时候总会报出一下错误: -- Could NOT find OpenSSL (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) ...

  8. man curl_global_init(原创)

    curl_global_init(3)             libcurl 手册             curl_global_init(3) 名称 curl_global_init - lib ...

  9. 教你理解Fragment

    定义 Fragment 表示 Activity 中的行为或用户界面部分.我们可以将多个片段组合在一个 Activity 中来构建多窗口UI,以及在多个 Activity 中重复使用某个片段.可以将片段 ...

  10. Android开源框架——Picasso

    开篇——介绍Picasso (Picasso是什么?)Picasso:A Powerfull Image Downloading and Caching Library for Android,即An ...