天天看點

threading 官方 線程對象和鎖對象以及條件對象condition

官方位址:​​https://docs.python.org/2/library/threading.html#thread-objects​​

以下隻截取condition部分,其他Lock()以及threading 部分見上述連結

16.2.4。條件對象

條件變量總是與某種鎖定相關聯。可以傳入,也可以預設建立一個。(當多個條件變量必須共享相同的鎖時,傳遞一個輸入很有用。)

條件變量具有​

​acquire()​

​​和​

​release()​

​​方法,它們調用關聯鎖的相應方法。它也有一個​

​wait()​

​​ 方法,​

​notify()​

​​和​

​notifyAll()​

​​方法。隻有在調用線程獲得了鎖時才必須調用這三個對象,否則 ​​RuntimeError​​引發a。

該​

​wait()​

​​方法釋放該鎖,然後阻塞直到被a ​

​notify()​

​​或​

​notifyAll()​

​另一個線程中的相同條件變量調用喚醒。喚醒後,它将重新擷取鎖并傳回。也可以指定逾時。

該​

​notify()​

​​方法喚醒等待條件變量的線程之一(如果有的話)。該​

​notifyAll()​

​方法喚醒所有等待條件變量的線程。

注意:​

​notify()​

​​和​

​notifyAll()​

​​方法不會釋放鎖;這意味着被喚醒的一個或多個線程不會​

​wait()​

​​立即從其調用中傳回,而僅在調用​

​notify()​

​​或​

​notifyAll()​

​最終放棄了鎖所有權的線程時 才會傳回 。

提示:使用條件變量的典型程式設計風格使用鎖來同步對某些共享狀态的通路;對狀态的特定更改感興趣的線程會​

​wait()​

​​反複調用,直到它們看到所需的狀态為止;而對狀态調用進行修改的線程​

​notify()​

​​或 ​

​notifyAll()​

​當它們以某種方式改變狀态(對于一個侍者來說可能是所需的狀态)時,線程将反複調用它們。例如,以下代碼是具有無限緩沖區容量的一般生産者-消費者情況:

# Consume one item
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()

# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()      

要在​

​notify()​

​​和之間進行選擇​

​notifyAll()​

​,請考慮一種狀态更改是否僅對一個或多個等待線程有意義。例如,在典型的生産者-消費者情況下,向緩沖區添加一項僅需要喚醒一個消費者線程。

類​

​threading.​

​​

​Condition​

​([ 鎖] )

如果指定了lock參數,但未指定參數,則該參數​

​None​

​​必須是a ​​Lock​​​ 或​​RLock​​​object,并用作基礎鎖。否則,将​​RLock​​建立一個新對象并将其用作基礎鎖。

​acquire​

​(* args )

擷取基礎鎖。此方法在基礎鎖上調用相應的方法;傳回值就是該方法傳回的值。

​release​

​()

釋放基礎鎖。此方法在基礎鎖上調用相應的方法;沒有傳回值。

​wait​

​([ 逾時] )

等到收到通知或發生逾時為止。如果在調用此方法時調用線程未擷取鎖,​​RuntimeError​​則會引發a。

此方法釋放基礎鎖,然後進行阻塞,直到被a ​​notify()​​​或​​notifyAll()​​在另一個線程中調用相同條件變量喚醒,或者直到發生可選的逾時為止。一旦喚醒或逾時,它将重新擷取鎖并傳回。

如果存在timeout參數而不是timeout參數​

​None​

​,則它應該是一個浮點數,以秒為機關(或幾分之一)指定操作的逾時時間。

當基礎鎖為時​​RLock​​​,它不會使用其​​release()​​​方法釋放,因為當遞歸擷取多次鎖時,它實際上可能無法解鎖。而是​​RLock​​使用該類的内部接口,即使遞歸擷取了幾次,它也可以真正将其解鎖。重新獲得鎖定後,另一個内部接口将用于恢複遞歸級别。

​notify​

​(n = 1 )

預設情況下,喚醒一個線程等待這種情況(如果有)。如果在調用此方法時調用線程未擷取鎖, ​​RuntimeError​​則會引發a。

該方法最多喚醒n個等待條件變量的線程。如果沒有線程在等待,則為空操作。

如果至少有n個 線程正在等待,則目前實作将恰好喚醒n 個線程。但是,依靠這種行為并不安全。未來的優化實作有時可能會喚醒 n個以上的線程。

注意:喚醒的線程​​wait()​​​ 直到可以重新擷取鎖才真正從調用傳回。由于​​notify()​​不釋放鎖,是以它的調用者應該。

​notify_all​

​()

​notifyAll​

​​()​​¶​​

喚醒所有在這種情況下等待的線程。此方法的行為類似于 ​​notify()​​​,但是喚醒所有等待的線程而不是一個。如果在調用此方法時調用線程未擷取鎖, ​​RuntimeError​​則會引發a。