1 Event對象的基本概述
用 multiprocessing.Event 實現線程間通訊,使用multiprocessing.Event能夠使一個線程等待其餘線程的通知,咱們把這個Event傳遞到線程對象中;主要用於主線程控制其餘線程的執行,事件主要提供了三個方法:wait、clear、set。html
事件處理的機制:python
全局定義了一個Flag;編程
若是Flag值爲False(clear:將Flag設置爲False),則執行event.wait方法時阻塞;url
若是Flag值爲True(set:將Flag設置爲True),則執行event.wait方法時不阻塞。spa
注:.net
event對象默認爲False,即遇到event對象在等待就阻塞線程的執行。線程
2 信號操做的三種方法
2.1 設置信號
使用Event的set()方法可設置Event對象內部的信號標誌爲True。code
Event對象提供了is_set()方法來判斷其內部信號標誌的狀態,當使用Event對象的set()方法後,is_set()方法返回真。htm
2.2 清除信號
使用Event對象的clear()方法可清除Event對象內部的信號標誌,即將其設置爲False,is_set()方法返回假對象
2.3 等待
Event對象wait的方法只有在內部信號爲真時纔會很快執行並完成返回。當Event對象的內部信號標誌爲假時,則wait方法一直等待直到其爲真時才返回。
3 示例
3.1 is_set() 查看對象是否被設置
from multiprocessing import Event # 建立事件對象 e = Event() # 查看對象是否被設置 print(e.is_set())
運行:False;說明爲默認阻塞的。
因默認爲False,此時運行wait時會被阻塞,例如
from multiprocessing import Event # 建立事件對象 e = Event() # 查看對象是否被設置 print(e.is_set()) e.wait() print('wait.........')
運行,打印出False以後,一直在阻塞中...
3.2 set()將默認設置爲True
from multiprocessing import Event # 建立事件對象 e = Event() # 查看對象是否被設置 print(e.is_set()) #對事件進行設置,將Event事件設置爲True e.set() e.wait() # set能夠衝破阻塞,wait...能夠打印出來 print('wait...')
運行
False wait...
wait(time)中的time參數能夠設置時間,當超過time時間後便可阻斷阻塞。例如
from multiprocessing import Event # 建立事件對象 e = Event() # 查看對象是否被設置 print(e.is_set()) e.wait(3) print('wait...')
運行
False wait...
備註:當超出阻塞時間3秒後,print('wait....')能夠被打印出來
3.3 綜合應用
from multiprocessing import Event,Process import time def wait_event(): print("wait for event setting") e.wait() print("wait for event 1:",e.is_set()) def wait_event_timeout(): print('wait for event setting or time out') e.wait(2) print("wait for event 2:",e.is_set()) e = Event() p1 = Process(name="block",target= wait_event) p1.start() p2 = Process(name="non-block",target= wait_event_timeout) p2.start() print("main: setting the event") time.sleep(3) e.set() print('event is set')
運行
main: setting the event wait for event setting or time out wait for event setting wait for event 2: False event is set wait for event 1: True
參考: