Python中lock和rlock(遞迴鎖)的區別

2021-08-21 18:50:31 字數 1210 閱讀 3292

在threading模組中,定義兩種型別的瑣:threading.lock和threading.rlock。它們之間有一點細微的區別,通過比較下面兩段**來說明:

import threading  

lock = threading.lock() #lock物件  

lock.acquire()  

lock.acquire()  #產生了死瑣。  

lock.release()  

lock.release()  

import threading  

rlock = threading.rlock()  #rlock物件  

rlock.acquire()  

rlock.acquire() #在同一執行緒內,程式不會堵塞。  

rlock.release()  

rlock.release()  

這兩種瑣的主要區別是:rlock允許在同一執行緒中被多次acquire。而lock卻不允許這種情況。注意:如果使用rlock,那麼acquire和release必須成對出現,即呼叫了n次acquire,必須呼叫n次的release才能真正釋放所占用的瑣。threading.condition

可以把condiftion理解為一把高階的瑣,它提供了比lock, rlock更高階的功能,允許我們能夠控制複雜的執行緒同步問題。threadiong.condition在內部維護乙個瑣物件(預設是rlock),可以在建立condigtion物件的時候把瑣物件作為引數傳入。condition也提供了acquire, release方法,其含義與瑣的acquire, release方法一致,其實它只是簡單的呼叫內部瑣物件的對應的方法而已。condition還提供了如下方法(特別要注意:這些方法只有在占用瑣(acquire)之後才能呼叫,否則將會報runtimeerror異常。):

condition.wait([timeout]):  

wait方法釋放內部所占用的瑣,同時執行緒被掛起,直至接收到通知被喚醒或超時(如果提供了timeout引數的話)。當執行緒被喚醒並重新占有瑣的時候,程式才會繼續執行下去。

condition.notify():

喚醒乙個掛起的執行緒(如果存在掛起的執行緒)。注意:notify()方法不會釋放所占用的瑣。

condition.notify_all()

condition.notifyall()

喚醒所有掛起的執行緒(如果存在掛起的執行緒)。注意:這些方法不會釋放所占用的瑣。

python中lock和rlock(遞迴鎖)的區別

在threading模組中,定義兩種型別的瑣 threading.lock和threading.rlock。它們之間有一點細微的區別,通過比較下面兩段 來說明 import threading lock threading.lock lock物件 lock.acquire lock.acquire ...

java中的lock和synchronized區別

1 reentrantlock 擁有synchronized相同的併發性和記憶體語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候 執行緒a和b都要獲取物件o的鎖定,假設a獲取了物件o鎖,b將等待a釋放對o的鎖定,如果使用 synchronized 如果a不釋放,b將一直等下去,不能被中斷 如果 使用...

python多執行緒中Lock 與RLock 鎖

資源總是有限的,程式執行如果對同乙個物件進行操作,則有可能造成資源的爭用,甚至導致死鎖 也可能導致讀寫混亂 鎖提供如下方法 1.lock.acquire blocking 2.lock.release 3.threading.lock 載入執行緒的鎖物件,是乙個基本的鎖物件,一次只能乙個鎖定,其餘鎖...