用 multiprocessing.Event 實現線程間通訊,使用multiprocessing.Event能夠使一個線程等待其餘線程的通知,
咱們把這個Event傳遞到線程對象中;主要用於主線程控制其餘線程的執行,事件主要提供了三個方法:wait、clear、set。
事件處理的機制:
全局定義了一個Flag; 若是Flag值爲False(clear:將Flag設置爲False),則執行event.wait方法時阻塞; 若是Flag值爲True(set:將Flag設置爲True),則執行event.wait方法時不阻塞。 注: event對象默認爲False,即遇到event對象在等待就阻塞線程的執行。
from multiprocessing import Event e=Event() # <multiprocessing.synchronize.Event object at 0x0000019295AA8400> 建立對象 print(e.is_set()) # False 查看 狀態 e.set() # 改變狀態Event默認是狀態是false print(e.is_set()) # True e.wait() # wait有一個阻塞效果 # 在以前必須改變Event默認狀態 纔會執行wait以後的代碼 print(1111111111) 執行結果 False True 1111111111
e=Event() print(e.is_set()) # 查看狀態 e.wait() # 被阻塞了 由於Event默認是False 要開起後纔會執行wait以後的代碼 print("11111111") # 不會打印出來 # 執行結果 False wait1 True
# wait(time)中的time參數能夠設置時間,當超過time時間後便可阻斷阻塞 e=Event() print(e.is_set()) # 查看狀態 e.wait(3) # 被阻塞了 由於Event默認是False 裏面設置時間 print("11111111") # 也會打印 # 執行結果 False 11111111
from multiprocessing import Event if __name__ == '__main__': e = Event() print(e.is_set()) #False # e.wait() <-會阻塞在此處 e.clear() #clear在wait後面,並不能生效。 print('wait1') e.set() print(e.is_set()) #True e.clear() e.wait() #不會阻塞 print('wait2')
False
wait1
Truepython
紅綠等 import random import time from multiprocessing import Process, Event def cars(event, i ): if not event.is_set(): print('cat: %s 等待紅燈' %i) event.wait() #阻塞直到事件狀態變爲 True的信號 else: print('\033[0;32;40mcar%i經過\033[0m'%i) def light(event): while True: if event.is_set(): event.clear() print('\033[31m紅燈亮了\033[0m') else: event.set() print('\033[32m綠燈亮了\033[0m') time.sleep(2) if __name__ == '__main__': event = Event() p = Process(target=light, args=(event,)) p.start() for i in range(20): car = Process(target= cars, args=(event, i )) car.start() time.sleep(random.random())