一、GIL:http://www.tuicool.com/articles/7zIra2r

      http://www.zhihu.com/question/23474039

二、线程锁

  在threading模块中,定义两种类型的锁:threading.Lock和threading.RLock。它们之间有一点细微的区别,通过比较下面两段代码来说明:

  1. import threading
  2. lock = threading.Lock() #Lock对象
  3. lock.acquire()
  4. lock.acquire()  #产生了死锁。
  5. lock.release()
  6. lock.release()
  1. import threading
  2. rLock = threading.RLock()  #RLock对象
  3. rLock.acquire()
  4. rLock.acquire() #在同一线程内,程序不会堵塞。
  5. rLock.release()
  6. 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()

  唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的锁。

三、注意事项

  Python由于有全锁局的存在(同一时间只能有一个线程执行),并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。

最新文章

  1. 幼儿园的 selenium
  2. mkdir命令
  3. socket是什么?(翻译)
  4. mysql datetime查询异常
  5. android语音识别和合成第三方 .
  6. c++之路进阶——hdu3507(Print Article)
  7. 在包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!的计算结果。
  8. Android(java)学习笔记265:Android线程形态之 HandlerThread
  9. C语言程序设计概述
  10. ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
  11. Two Sum-n方优化与C++map的使用
  12. IIS 反向代理 golang web开发
  13. Python入门 - 容器类型
  14. UVA1349:Optimal Bus Route Design
  15. BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
  16. OpenCV4.1.0实践(1) - 环境配置及使用
  17. MyBatis使用注意事项
  18. QMap迭代器
  19. ionic3 ionic serve build fail Error: webpackJsonP is not defined
  20. Go搭建后台服务学习记录

热门文章

  1. 【HTML】百度地图webAPI使用
  2. redis可视化工具的安装和调试
  3. Python-Mac OS X EI Capitan下安装Scrapy
  4. 使用jq Deferred防止代码被回调函数分解分解的支离破碎
  5. python selenium --处理下拉框
  6. Hibernate 操作 oracle数据库,报错总结
  7. 联想E440问题:点击鼠标时,弹出“无法连接synaptics定点装置驱动程序”错误
  8. SpringCloud系列十六:Feign使用Hystrix
  9. printf函数对参数的计算顺序
  10. glibc/libc/blib区别