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