標籤:time reading 同步 多重 需要 線程 python int 記錄
資源總是有限的,程式運行如果對同一個對象進行操作,則有可能造成資源的爭用,甚至導致死結,或者導致讀寫混亂,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.Thread def __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 線程鎖