python2.7 threading RLock/Condition文档翻译 (RLock/Condition详解)
RLock Objects
可重入鎖是一個同步原語,它可以被同一個線程多次獲取。在內(nèi)部,除了原始鎖使用的鎖定/解鎖狀態(tài)之外,它還使用“線程擁有”和“遞歸級別”的概念。在鎖定狀態(tài)下,某些線程擁有鎖;在未鎖定狀態(tài)下,沒有線程擁有它。
為了鎖定該鎖,線程調(diào)用它的acquire()方法,一旦線程擁有鎖就會返回。解鎖則調(diào)用它的release()方法。acquire()/release()成對調(diào)用且可被嵌套;只有調(diào)用最后的release()(最外層對中的release())才會將鎖重置為解除狀態(tài)并允許其他線程通過acquire()方法進行阻塞。
RLock.acquire([blocking=1]) 獲取鎖,阻塞或非阻塞
- 當不傳遞參數(shù)調(diào)用時: 如果線程已經(jīng)擁有鎖,則遞歸等級加一,并立即返回。否則,如果其他的參數(shù)擁有鎖,則阻塞(等待)直到該鎖解除。一旦該鎖解除(不再被其他線程所擁有),立即奪得所有權(quán),將遞歸等級設置為一并返回。如果有更多的線程處于阻塞中則等待直到鎖解除,每次只有一個線程能獲得鎖的所有權(quán)。在這種調(diào)用情況(不傳遞參數(shù))下沒有返回值。
- 當設置blocking為True調(diào)用時: 情況與不傳遞參數(shù)值時相同,并返回true
- 當設置blocking為False調(diào)用時: 不阻塞,如果一個不傳遞參數(shù)的調(diào)用將導致阻塞則立即返回false(*);否則,則與不傳遞參數(shù)調(diào)用相同,并返回true
- *:經(jīng)過實驗與個人理解,這句話的含義為該調(diào)用方式不會等待阻塞結(jié)束,當其他線程擁有鎖即處于阻塞狀態(tài)時,該調(diào)用會立即返回false
RLock.release()
- 釋放鎖,遞減遞歸等級。如果在遞減之后遞歸等級為零,則將鎖重置為解鎖狀態(tài)(不被任何線程所擁有),若此時有其他線程被阻塞等待鎖解鎖,則允許其中一個線程繼續(xù)執(zhí)行。如果在遞減之后遞歸等級不為零,則鎖仍被鎖住并歸調(diào)用線程所有。
- 只有在調(diào)用線程擁有鎖時才能調(diào)用此方法,否則會引發(fā)運行時錯誤
- 該方法無返回值
? Condition Objects
Condition(條件變量)通常與一個鎖關聯(lián)。需要在多個Contidion中共享一個鎖時,這可以傳遞,默認情況將會生成一個(*)(當多個條件變量必須共享同一個鎖時,傳入一個鎖是有用的)
*:可以傳遞一個Lock/RLock實例給構(gòu)造方法,否則它將自己生成一個實例
一個條件變量的acquire()和release()方法會調(diào)用關聯(lián)鎖的相應方法。它還有wait(),notify()和notifyAll()方法,只有調(diào)用線程擁有鎖時才可以調(diào)用這三個方法,否則將產(chǎn)生運行時錯誤。
wait()方法會釋放鎖,并且阻塞直到notify()或notifyAll()方法調(diào)用另一個線程中的相同條件變量喚醒它。一旦被喚醒,它立即重新獲得鎖并返回。調(diào)用時可指定timeout(超時時間)
notify()方法喚醒一個等待條件變量的線程,如果有等待的話。notifyAll()方法喚醒所有等待條件變量的線程。
注意:notify()和notifyAll()方法不會釋放鎖,這意味著線程或被喚醒的線程不會立即從它們的wait()調(diào)用中返回,但只有調(diào)用notify()和notifyAll()的線程才會最終放棄鎖的所有權(quán)(并返回)
小貼士:略
class threading.Condition([lock])
如果lock參數(shù)被設定且不為None,則其必須為Lock或RLock對象,且它會被作為基礎鎖。否則,會創(chuàng)建一個Rlock對象作為基礎鎖。
- acquire(*args)??? 獲取基礎鎖。該方法會調(diào)用基礎鎖的相應方法,其返回值就是該方法的返回值
- release()???? 釋放基礎鎖。該方法會調(diào)用基礎鎖的相應方法,無返回值
- wait([timeout])???? 等待直到通知或超時發(fā)生。若調(diào)用該方法的線程沒有獲得鎖則會產(chǎn)生一個運行時錯誤。該方法會釋放基礎鎖,并且 阻塞直到notify()或notifyAll()方法調(diào)用另一個線程中的相同條件變量喚醒它,或者直到可選的超時發(fā)生。一旦被喚醒或者超時,它重新獲得鎖并返回。當timeout參數(shù)被提供且不為None,它應該是一個浮點數(shù),指定以秒為單位的操作超時(或分數(shù))。當基礎鎖為Rlock時,它不使用其release()方法進行釋放,因為當它多次被遞歸獲得時,它可能不會真正的解鎖。相反,一個RLock類的內(nèi)部接口會被使用,即使遞歸地獲取了多次,它也會解除鎖定。接下來重新獲得鎖時會調(diào)用另一個內(nèi)部接口以恢復存儲的(之前的)遞歸等級。
- notify(n=1)?? 默認情況下,喚醒一個等待該條件的線程,如果有的話。如果調(diào)用該方法的線程沒有獲得鎖,會產(chǎn)生一個運行時錯誤。該方法最多喚醒n個等待條件變量的線程,如果沒有線程等待,這會是一個空指令。如果至少有n個線程在等待,則當前實現(xiàn)將喚醒n個線程,然而依靠這種行為是不安全的,一個未來優(yōu)化的實現(xiàn)有時會喚醒超過n個線程。 ?? 注意:一個被喚醒的線程實際上不會從它的wait()調(diào)用中返回直到它重新獲得鎖,因為notify()不會釋放鎖,它的調(diào)用者應該清楚。
- notifyAll()(notify_all())??? 喚醒所有等待條件的線程,該方法的行為與notify()相似但喚醒所有等待的線程而不是單單一個。如果調(diào)用該方法時調(diào)用線程沒有獲得鎖,則會產(chǎn)生一個運行時錯誤。在版本2.6中添加了notify_all()這種拼寫。
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoblue/p/9410721.html
總結(jié)
以上是生活随笔為你收集整理的python2.7 threading RLock/Condition文档翻译 (RLock/Condition详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 课后作业-阅读任务-阅读笔记4
- 下一篇: python的变量命名及其使用