Python線程專題6:事件

上一篇文章: Python線程專題5:信號量與有邊界的信號量
下一篇文章: Python線程專題7:條件變量

事件用於在線程之間通訊。一個線程發送【事件】信號,一個或多個其餘線程等待它。segmentfault

Event實例管理着一個內部標誌,可使用set()方法將它置爲True,或者使用clear()方法將它重置爲False。wait()方法將阻塞,直到標誌爲True。線程

語法:

e=Event()
建立新的Event實例,並將內部標誌設置爲False。

經常使用方法:

e.is_set():只有當內部標誌設爲True時才返回True

e.set():將內部標誌設置爲True。等待它變爲True的全部線程都講被喚醒。

e.clear():將內部標誌重置爲False。

e.wait(timeout):阻塞直到內部標誌爲True。若是調用時內部標誌爲True,此方法將當即返回。
不然,它將阻塞,直到另外一個線程調用set()方法將標誌設置爲True,或者出現可選的超時時。

注意

儘管Event對象可用於給其餘線程發送信號,但不該該使用他們來實如今生產者和消費者的通知,例以下面代碼:
evt=Event()

def producer():
    while True:
        #生產項
        ...
        evt.signal()
def consumer():
    while True:
        #等待一個項
        evt.wait()
        #消費項
        ...
        #清除事件並再次等待
        evt.clear()
應該 儘可能避免上面代碼,由於這段代碼不可靠,由於在evt.wait() 與evt.clear()操做之間,生產者可能生產了一個新項。可是,經過清楚事件,在生產者建立一個新項以前,消費者可能看不到這個新項。最好的狀況是:程序將通過一段很短的停滯,對項的處理被莫名其妙的推遲。最壞的狀況是,因爲事件信號丟失,整個程序將會掛起。要解決這類問題,最好使用條件變量。
相關文章
相關標籤/搜索