上一篇文章: 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循環,若是線程醒來,可是生成的項已經消失,它就會回去等待下一個信號。