python 線程鎖
阿新 • • 發佈:2018-03-14
thread 有一個 鎖定 程序 可重入鎖 建立 多重 star threading
資源總是有限的,程序運行如果對同一個對象進行操作,則有可能造成資源的爭用,甚至導致死鎖,或者導致讀寫混亂,python中提供線程鎖對線程的調用進行控制
鎖提供如下方法:
1.Lock.acquire([blocking])
2.Lock.release() 把
3.threading.Lock() 加載線程的鎖對象,是一個基本的鎖對象,一次只能一個鎖定,其余鎖請求,需等待鎖釋放後才能獲取
4.threading.RLock() 多重鎖,在同一線程中可用被多次acquire。如果使用RLock,那麽acquire和release必須成對出現,
調用了n次acquire鎖請求,則必須調用n次的release才能在線程中釋放鎖對象
lock實例
import threading import time counter = 0 counter_lock = threading.Lock() #只是定義一個鎖,可以定義多個鎖,需要的時候,任意一個鎖可以鎖定資源 counter_lock2 = threading.Lock() counter_lock3 = threading.Lock() #可以使用上邊三個鎖的任何一個來鎖定資源 class MyTestThread(threading.Thread):#使用類定義thread,繼承threading.Threaddef __init__(self,name): threading.Thread.__init__(self) self.name = "Thread-" + str(name) def run(self): #重寫run函數,run函數必須實現 global counter,counter_lock #定義全局變量 time.sleep(1); #通過線程掛起,查看是否會出現資源紊亂 if counter_lock.acquire(): #當需要獨占counter資源時,必須先鎖定,這個鎖可以是任意的一個鎖,可以使用上邊定義的3個鎖中的任意一個counter += 1 print "I am %s, set counter:%s" % (self.name,counter) counter_lock.release() #使用完counter資源必須要將這個鎖打開,讓其他線程使用 ,lock與release必須成對出現 if __name__ == "__main__": for i in range(1,101): my_thread = MyThread(i) my_thread.start()
通過先建立一個lock鎖,在線程的run()方法中,使用lock鎖定全局變量,這時候使得此全局變量只會被當前線程使用和修改,不會出現多個線程同時修改一個變量的情況,在該線程運行完成之後,release釋放同步鎖,使得其他的線程可以競爭該全局變量,從而保證了全局變量的安全性。
在threading模塊中還有一個RLOCK類,稱之為可重入鎖。該鎖對象內部維護著一個Lock和一個counter對象。counter對象記錄了acquire的次數,使得資源可以被多次require。最後,當所有RLock被release後,其他線程才能獲取資源。在同一個線程中,RLock.acquire可以被多次調用,利用該特性,可以解決部分死鎖問題。
python 線程鎖