python 之 GIL(线程和进程的应用)
一、GIL:http://www.tuicool.com/articles/7zIra2r
http://www.zhihu.com/question/23474039
二、线程锁
在threading模块中,定义两种类型的锁:threading.Lock和threading.RLock。它们之间有一点细微的区别,通过比较下面两段代码来说明:
- import threading
- lock = threading.Lock() #Lock对象
- lock.acquire()
- lock.acquire() #产生了死锁。
- lock.release()
- lock.release()
- import threading
- rLock = threading.RLock() #RLock对象
- rLock.acquire()
- rLock.acquire() #在同一线程内,程序不会堵塞。
- rLock.release()
- rLock.release()
这两种琐的主要区别是:RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。threading.Condition
可以把Condiftion理解为一把高级的锁,它提供了比Lock, RLock更高级的功能,允许我们能够控制复杂的线程同步问题。threadiong.Condition在内部维护一个锁对象(默认是RLock),可以在创建Condigtion对象的时候把锁对象作为参数传入。Condition也提供了acquire, release方法,其含义与锁的acquire, release方法一致,其实它只是简单的调用内部锁对象的对应的方法而已。Condition还提供了如下方法(特别要注意:这些方法只有在占用锁(acquire)之后才能调用,否则将会报RuntimeError异常。):
Condition.wait([timeout]):
wait方法释放内部所占用的锁,同时线程被挂起,直至接收到通知被唤醒或超时(如果提供了timeout参数的话)。当线程被唤醒并重新占有锁的时候,程序才会继续执行下去。
Condition.notify():
唤醒一个挂起的线程(如果存在挂起的线程)。注意:notify()方法不会释放所占用的锁。
Condition.notify_all()
Condition.notifyAll()
唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的锁。
三、注意事项
最新文章
- 幼儿园的 selenium
- mkdir命令
- socket是什么?(翻译)
- mysql datetime查询异常
- android语音识别和合成第三方 .
- c++之路进阶——hdu3507(Print Article)
- 在包a中新建一个类A,在类A中有一个int add(int m)方法,用来求1+2+…+m 的和。在包b中新建一个类B,在类B中有一个int cheng(int n)方法,用来求n! 的结果。在包c中新建一个主类C,调用A、B中的方法输出1+2+…+30的和, 以及5!的计算结果。
- Android(java)学习笔记265:Android线程形态之 HandlerThread
- C语言程序设计概述
- ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
- Two Sum-n方优化与C++map的使用
- IIS 反向代理 golang web开发
- Python入门 - 容器类型
- UVA1349:Optimal Bus Route Design
- BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
- OpenCV4.1.0实践(1) - 环境配置及使用
- MyBatis使用注意事项
- QMap迭代器
- ionic3 ionic serve build fail Error: webpackJsonP is not defined
- Go搭建后台服务学习记录