首先看一个例子,让我们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)