Python線程專題7:條件變量

上一篇文章: Python線程專題6:事件
下一篇文章: Python線程專題8:使用鎖的注意事項

條件變量時構建在另外一個鎖上的同步原語,當須要線程關注特定的狀態變化或事件發生時將使用這個鎖。典型的用法是生產者與消費者問題,其中一個線程生產的數據提供給另一個線程使用。segmentfault

語法:

c=Condition(lock)
穿件新的條件變量。lock時可選的Lock或RLock的實例。若是未提供lock參數,就會建立新的RLock實例供條件變量使用。

經常使用方法:

c.acquire(*args):獲取底層鎖。此方法將調用底層鎖上對應的acquire(*args)方法。

c.release():釋放底層鎖。此方法將調用底層鎖上對應的release()方法

c.wait(timeout):等待直到獲取通知或出現超時爲止。此方法在調用線程已經獲取鎖以後調用。
調用時,將釋放底層鎖,並且線程將進入睡眠狀態,直到另外一個線程在條件變量上執行notify()或notify_all()方法將其喚醒爲止。
在線程被喚醒後,線程講從新獲取鎖,方法也會返回。timeout是浮點數,單位爲秒。
若是超時,線程將被喚醒,從新獲取鎖,而控制將被返回。

c.notify(n):喚醒一個或多個等待此條件變量的線程。此方法只會在調用線程已經獲取鎖以後調用,
並且若是沒有正在等待的線程,它就什麼也不作。
n指定要喚醒的線程數量,默認爲1.被喚醒的線程在它們從新獲取鎖以前不會從wait()調用返回。

c.notify_all():喚醒全部等待此條件的線程。

實例模版:使用條件變量

#條件變量實例
from threading import Condition

c=Condition()
def producer():
    while True:
        c.acquire()
        #生產東西
        ...
        c.notify()
        c.release()

def consumer():
    while True:
        c.acquire()
        while 沒有可用的東西:
            c.wait()#等待出現
        c.release()
        #使用生產的東西
        ...
注意:若是存在多個線程等待同一個條件,notify()操做會喚醒他們中的一個或多個(這種行爲取決於底層的操做系統)。所以,始終有這樣的可能:某個線程被喚醒後,缺發現它等待的條件不存在了,這解釋了爲何在consumer函數中使用while循環,若是線程醒來,可是生成的項已經消失,它就會回去等待下一個信號。
相關文章
相關標籤/搜索