在 python 中,加鎖是保證線程安全的重要手段之一。對于常常在多個線程中被訪問的資源,如果沒有采取任何措施,那么就很容易出現(xiàn)數(shù)據(jù)競爭等不可預(yù)期的后果。
Python 中提供了很多種不同類型的鎖,其中比較常用的是 threading 模塊中的 Lock 和 RLock。
import threading lock = threading.Lock() # 創(chuàng)建一個 Lock 對象 def func(): with lock: # 使用 with 語句,自動獲取和釋放鎖 # 執(zhí)行需要保護(hù)的代碼塊 pass
Lock 對象的 acquire() 方法可以手動獲取鎖,release() 方法可以手動釋放鎖。當(dāng)使用 with 語句時,程序?qū)⒆詣釉诖a塊執(zhí)行前獲取鎖,在執(zhí)行完畢后自動釋放鎖,這樣可以極大地降低代碼的出錯概率。
與 Lock 相比,RLock 具有更加靈活的特性。在同一線程中可以多次獲取同一個 RLock 對象,并且只有在調(diào)用對應(yīng)數(shù)量的 release() 方法后,才能真正釋放鎖。
import threading lock = threading.RLock() # 創(chuàng)建一個 RLock 對象 def func(): with lock: # 獲取鎖之后再次獲取鎖 with lock: # 執(zhí)行需要保護(hù)的代碼塊 pass
除了 Lock 和 RLock 外,在 Python 中還有很多其他的鎖類型,例如 Semaphore、Event、Condition 等等。不同類型的鎖之間,有著各自的適用場景。