2014-02-09 160 views
1

我們在多線程Python環境中工作,需要一段代碼就像一個互斥:Python的二進制信號VS鎖

lock = threading.Lock() 
with lock: 
    # get data from shared storage 
    # process 
    # put back to shared storage 

目前,它在我看來,二進制信號threading.Semaphore()並鎖定threading.Lock() 將同樣爲此服務。如果我從鎖定狀態切換到二進制信號狀態,或者從鎖定狀態切換到二進制信號狀態,是否有一些陷阱或獲得?

注:代碼運行內部greenthreads(如果改變的情況)

回答

1

threading.Semaphore()使用threading.Lock()對象在內部作爲一個監視器。當調用Semaphore.acquire()時,信號量對象調用其Lock對象的獲取值,遞減其值並釋放鎖定。

由此可見,二進制Semaphore實際上只是一個Lock的包裝。我想不出兩者之間有什麼功能上的區別,除了Semaphore可以通過可選的verbose = True參數進行調試,並且可以選擇使用blocking = False來調用acquire。

+0

謝謝!順便說一句鎖也有lock.acquire(blocking = False)選項 –

+12

你在開玩笑嗎?你只是解釋說他們是不一樣的,然後你得出結論,他們看起來是一樣的......他們是毫不相同的。雖然信號量可以被線程1鎖定並被線程2解鎖,但鎖只能被同一線程的__only__鎖定和解鎖!只有增量和減量操作通過鎖定和解鎖操作進行同步。並且只有inc/dec操作中的鎖定操作由同一個線程完成。 – Roberto