1. 程式人生 > >python 線程鎖

python 線程鎖

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.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 線程鎖