Python 提供了多種同步機制來確保在多線程環境下的數據一致性和避免競態條件。以下是一些常用的同步機制:
Lock(鎖)
threading.Lock
是 Python 中最基本的同步原語,用于保護臨界區資源,防止多個線程同時訪問。使用 acquire()
方法獲取鎖,release()
方法釋放鎖。
import threading
lock = threading.Lock()
def critical_section():
with lock:
# 訪問共享資源
RLock(可重入鎖)
threading.RLock
與 Lock
類似,但允許同一線程多次獲取同一個鎖。這對于實現遞歸鎖定或確保在已持有鎖的情況下不會死鎖非常有用。
import threading
rlock = threading.RLock()
def critical_section():
with rlock:
# 訪問共享資源
Semaphore(信號量)
threading.Semaphore
用于限制對共享資源的訪問。信號量內部維護一個計數器,表示當前可用資源的數量。當線程請求資源時,計數器減一;當線程釋放資源時,計數器加一。
import threading
semaphore = threading.Semaphore(max_connections)
def connect_to_resource():
with semaphore:
# 連接到共享資源
Condition(條件變量)
threading.Condition
允許線程等待某個條件成立。它通常與鎖一起使用,以便在條件不滿足時阻塞線程,并在條件滿足時喚醒線程。
import threading
condition = threading.Condition()
def worker():
with condition:
while not some_condition():
condition.wait()
# 執行任務
Event(事件)
threading.Event
是一個簡單的同步原語,允許一個或多個線程等待某個事件的發生。當事件被設置時,所有等待的線程將被喚醒。
import threading
event = threading.Event()
def worker():
event.wait() # 等待事件
# 事件發生后執行任務
def main():
# 啟動工作線程
event.set() # 設置事件
Barrier(屏障)
threading.Barrier
允許一組線程相互等待,直到所有線程都達到屏障位置。這對于需要多個線程協同完成任務的場景非常有用。
import threading
barrier = threading.Barrier(num_threads)
def worker():
# 執行任務
barrier.wait() # 等待其他線程
# 所有線程達到屏障后繼續執行
這些同步機制可以幫助您在多線程環境中編寫安全、高效的代碼。請根據您的需求選擇合適的同步原語。