day9-什么是递归锁(Rlock)
一、概述
我们今天来聊聊递归锁,到底什么是递归锁,为什么会存在?
二、递归锁
2.1、举例子说明
说明:比如你进学校去班级,结果进学校的时候有一道门,进班级的时候又有一道门,你首先进入学校要把第一道门打开,然后锁上。进入学校之后,你又要进班级的门,然后锁上。然后你出班级,就是要打开第二把锁,然后再出校门打开第一把锁。但是这边有一个疑问,就是你在开锁的时候,两把锁的钥匙是一样的,也就是你被困在里面了,出不来了。多重锁把你完美的锁在里面了。代码如下:
递归锁(Rlock)
说明:递归锁的意思就是一把大锁还要包含子锁。用theading.RLock()设置递归锁。
1 import threading 2 3 def run1(): 4 print("grab the first part data") 5 lock.acquire() #修改num前加锁 6 global num 7 num +=1 8 lock.release() #释放锁 9 return num 10 def run2(): 11 print("grab the second part data") 12 lock.acquire() #修改num2前加锁 13 global num2 14 num2+=1 15 lock.release() #释放锁 16 return num2 17 def run3(): 18 lock.acquire() #加锁 19 res = run1() #执行run1函数 20 print('--------between run1 and run2-----') 21 res2 = run2() #执行run2函数 22 lock.release() #释放锁 23 print(res,res2) 24 25 26 if __name__ == '__main__': 27 28 num,num2 = 0,0 29 lock = threading.RLock() #设置递归锁的全局变量 30 for i in range(10): 31 t = threading.Thread(target=run3) 32 t.start() 33 34 while threading.active_count() != 1: #判断是否只剩主线程了 35 print(threading.active_count()) 36 else: 37 print('----all threads done---') 38 print(num,num2)
2.3、递归锁原理
原理其实很简单的:就是递归锁,每开一把门,在字典里面存一份数据,退出的时候去到door1或者door2里面找到这个钥匙退出就OK了。
|
1
2
3
4
|
lock = {door1:key1,door2:key2} |
逻辑图:

递归锁用于多重锁的情况,如果只是一层锁,我们不用。在实际情况下,递归锁场景用的不是特别多,所以知道就行了。

浙公网安备 33010602011771号