二十八、Python 线程锁threading.RLock 和 threading.Lock

我们使用线程进行操作的时候,如果多个线程同时修改某个数据,可能会出现不可预料的结果,为了保证数据的正确性,引入了锁的概念。

 1 import threading
 2 import time
 3 
 4 global_num = 0
 5 lock = threading.RLock()
 6 
 7 def Func():
 8     lock.acquire() #获得锁
 9     global global_num
10     global_num += 1
11     time.sleep(1)
12     print(global_num)
13     lock.release() #释放锁
14 
15 
16 for i in range(10):
17     t = threading.Thread(target = Func)
18     t.start()

threading.RLock 和 threading.Lock 的区别

RLock 允许在同一个线程中被多次acquire。 而Lock 却不允许这个情况。 如果使用RLoc, 那么acquire 和release 必须成对出现,即调用了n次acquire,必须调用n次

release 才能这正释放所占用的锁。

 1 import threading
 2 lock = threading.Lock #Lock对象
 3 
 4 lock.acquire()
 5 lock.acquire() #产生了死锁
 6 lock.release()
 7 lock.release()
 8 
 9 
10 import threading
11 rLock = threading.RLock() # RLock 对象
12 rLock.acquire()
13 rLock.acquire()  #在同一个线程内,程序不会堵塞
14 
15 rLock.release()
16 rLock.release()

 

posted @ 2016-07-26 19:42  咖啡茶  阅读(367)  评论(0)    收藏  举报