Python 线程互斥锁 死锁 递归锁 信号量
1、继承类方式创建线程对象
继承threading类,有了所有threading的方法
重写run()方法,run方法是类里面的一个方法,重写的话会走自己定义的内容

2、线程安全问题
time.sleep的时候100个线程拿到的temp值都是100所以最终结果是99

3、图解 线程安全问题
当遇到IO的时候线程会切换

4、互斥锁
一个线程加上互斥锁之后,其他线程acquire不了锁,其他线程会阻塞住,其他线程都会等待释放锁
lock=threading.Lock() #获取锁对象
lock.acquire() #获取锁
lock.release() #释放锁

5、死锁 就是两把锁互相等待着一把锁的释放
当线程1释放foo的A和B锁,在获取bar的B锁,这个时候线程2获取foo的A锁,这样就成了死锁
bar等待释放A锁,foo等待释放B锁

6、递归锁Rlock解决了死锁问题
Rlock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,
Rlock允许多次acquire和多次release,这就是他跟互斥锁的不同,互斥锁只能一次acquire和release
Rlock每次acquire一次counter加一,release一次减一
只要计数器大于0其他线程不具有抢这个锁的资格,所以不会有死锁问题
创建RLOCK很简单 RLOCK=threading.RLock()

7、信号量 Semaphore
signal = threading.Semaphore(6) 同时有6个线程可以获得这把锁
递归锁是一把大锁里面一层一层嵌套的,信号量是并列的
信号量解决的就是最大连接数连接池的概念,这个口子只能同时6个人访问,其他人排队
信号量创建方法跟互斥锁一样,获取锁对象,加锁,释放锁

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:86
阅读量:152
阅读量:115
阅读量:159
阅读量:171