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
}

逻辑图:

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

posted @ 2018-03-19 14:02  东郭仔  阅读(717)  评论(0)    收藏  举报