pythonの递归锁

首先看一个例子,让我们lock = threading.Lock() 时(代码第33行),程序会卡死在这里

 1 #!/usr/bin/env python
 2 import threading,time
 3 
 4 
 5 def run1():
 6     print("grab the first part data")
 7     # 申请锁
 8     lock.acquire()
 9     # 将全局的变量,在此声明一下
10     global  num
11     num += 1
12     # 释放锁
13     lock.release()
14     return  num
15 def run2():
16     print("grab the second part data")
17     lock.acquire()
18     global  num2
19     num2 += 1
20     lock.release()
21     return  num2
22 def run3():
23     lock.acquire()
24     res = run1()
25     print("between run1 and run2")
26     res2 = run2()
27     lock.release()
28     print(res,res2)
29 
30 if __name__ == "__main__":
31     num,num2 = 0,0
32     # 递归锁
33     lock = threading.Lock()
34     for i in range(10):
35         t = threading.Thread(target=run3)
36         t.start()
37 
38 while threading.active_count() != 1:
39     print(threading.active_count())
40 
41 else:
42     print("all threads done")
43     print(num,num2)

如果我们将其改为lock = threading.RLock(),那么程序就能正常运行,这个就是递归锁  RLock()

 1 #!/usr/bin/env python
 2 import threading,time
 3 
 4 
 5 def run1():
 6     print("grab the first part data")
 7     # 申请锁
 8     lock.acquire()
 9     # 将全局的变量,在此声明一下
10     global  num
11     num += 1
12     # 释放锁
13     lock.release()
14     return  num
15 def run2():
16     print("grab the second part data")
17     lock.acquire()
18     global  num2
19     num2 += 1
20     lock.release()
21     return  num2
22 def run3():
23     lock.acquire()
24     res = run1()
25     print("between run1 and run2")
26     res2 = run2()
27     lock.release()
28     print(res,res2)
29 
30 if __name__ == "__main__":
31     num,num2 = 0,0
32     # 递归锁
33     lock = threading.RLock()
34     for i in range(10):
35         t = threading.Thread(target=run3)
36         t.start()
37 
38 while threading.active_count() != 1:
39     print(threading.active_count())
40 
41 else:
42     print("all threads done")
43     print(num,num2)
原文地址:https://www.cnblogs.com/pengpengzhang/p/9577289.html