Python 线程互斥锁 死锁 递归锁 信号量

2025-11-23 05:15:41

1、继承类方式创建线程对象

继承threading类,有了所有threading的方法

重写run()方法,run方法是类里面的一个方法,重写的话会走自己定义的内容

Python 线程互斥锁 死锁 递归锁 信号量

2、线程安全问题

time.sleep的时候100个线程拿到的temp值都是100所以最终结果是99

Python 线程互斥锁 死锁 递归锁 信号量

3、图解 线程安全问题

当遇到IO的时候线程会切换

Python 线程互斥锁 死锁 递归锁 信号量

4、互斥锁 

一个线程加上互斥锁之后,其他线程acquire不了锁,其他线程会阻塞住,其他线程都会等待释放锁

lock=threading.Lock() #获取锁对象

lock.acquire()  #获取锁

lock.release() #释放锁

Python 线程互斥锁 死锁 递归锁 信号量

5、死锁 就是两把锁互相等待着一把锁的释放

当线程1释放foo的A和B锁,在获取bar的B锁,这个时候线程2获取foo的A锁,这样就成了死锁

bar等待释放A锁,foo等待释放B锁

Python 线程互斥锁 死锁 递归锁 信号量

6、递归锁Rlock解决了死锁问题

Rlock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,

Rlock允许多次acquire和多次release,这就是他跟互斥锁的不同,互斥锁只能一次acquire和release

Rlock每次acquire一次counter加一,release一次减一

只要计数器大于0其他线程不具有抢这个锁的资格,所以不会有死锁问题

创建RLOCK很简单 RLOCK=threading.RLock()

Python 线程互斥锁 死锁 递归锁 信号量

7、信号量 Semaphore

signal = threading.Semaphore(6) 同时有6个线程可以获得这把锁

递归锁是一把大锁里面一层一层嵌套的,信号量是并列的

信号量解决的就是最大连接数连接池的概念,这个口子只能同时6个人访问,其他人排队

信号量创建方法跟互斥锁一样,获取锁对象,加锁,释放锁

Python 线程互斥锁 死锁 递归锁 信号量

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