python-執行緒互斥鎖與遞迴鎖
阿新 • • 發佈:2019-01-10
1.執行緒跟程序裡的互斥鎖一樣:
將多個併發任務的部分程式碼(只涉及修改共享資料的程式碼,程式設計序列執行緒或程序操作)
加鎖可以保證多個程序修改同一資料,同一時間只能只要一個任務可以進行修改,這樣可以保證資料的安全性,單犧牲了速度
from threading import thread,lock import time mutex=lock() x=100 def task(): global x mutex.acquire() temp=x time.sleep(1) x=temp-1 mutex.release() if __name__ =='__main__': t_l=[] start=time.time() for i in tange(): t=thread(target=task) t_l.append(t) t.start() for t in t_l: t.join() shop=time.time() print(x,stop-start)
遞迴鎖:互斥鎖一旦運用在多個修改共享資料的時候,會出現鎖死的情況,所以這個時候需要用到遞迴鎖
特點:可以連續的acquire()
from threading import Thread,Lock,active_count,RLock import time # mutexA=Lock() # mutexB=Lock() obj=RLock() #遞迴鎖的特點:可以連續的acquire mutexA=obj mutexB=obj class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A鎖' %self.name) mutexB.acquire() print('%s 拿到B鎖' %self.name) mutexB.release() mutexA.release() def f2(self): mutexB.acquire() print('%s 拿到B鎖' %self.name) time.sleep(1) mutexA.acquire() print('%s 拿到A鎖' %self.name) mutexA.release() mutexB.release() if __name__ == '__main__': for i in range(10): t=Mythread() t.start() print(active_count()) #統計當前執行緒數
#遞迴鎖的特點:可以連續的acquire mutexA=obj mutexB=obj class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A鎖' %self.name) mutexB.acquire() print('%s 拿到B鎖' %self.name) mutexB.release() mutexA.release() def f2(self): mutexB.acquire() print('%s 拿到B鎖' %self.name) time.sleep(1) mutexA.acquire() print('%s 拿到A鎖' %self.name) mutexA.release() mutexB.release() if __name__ == '__main__': for i in range(10): t=Mythread() t.start() print(active_count()) #統計當前執行緒數