python線程的事件用於主線程控制其他線程的執行,事件主要提供了三個方法wait、clear、set
事件處理的機制:全局定義了一個“Flag”,如果“Flag”值為 False,那么當程序執行 event.wait 方法時就會阻塞,如果“Flag”值為True,那么執行event.wait 方法時便不再阻塞。
- clear:將“Flag”設置為False
- set:將“Flag”設置為True
用 threading.Event 實現線程間通信,使用threading.Event可以使一個線程等待其他線程的通知,我們把這個Event傳遞到線程對象中,
Event默認內置了一個標志,初始值為False。一旦該線程通過wait()方法進入等待狀態,直到另一個線程調用該Event的set()方法將內置標志設置為True時,該Event會通知所有等待狀態的線程恢復運行。
1 #!/usr/bin/python3 2 #_*_ coding: UTF-8 _*_ 3 4 5 import threading, time 6 import random 7 8 def light(): 9 if not event.isSet(): 10 event.set() #wait就不阻塞 #綠燈狀態 11 count = 0 12 i=0 13 while True: 14 if count <10: 15 print("---green light on ---") 16 elif count<13: 17 print("---yellow light on ---") 18 elif count <20: 19 if event.isSet(): 20 event.clear() 21 print("---red light on ---") 22 else: 23 count = 0 24 event.set()#打開綠燈 25 time.sleep(1) 26 count +=1 27 i+=1 28 if(i>20): 29 break 30 def car(n): 31 i=0 32 while 1: 33 time.sleep(random.randrange(3)) 34 if event.isSet():#如果是綠燈 35 print("car [%s] is running.."%n) 36 else: 37 print("car [%s] is waiting for the red light.."%n) 38 if(i>10): 39 break 40 else: 41 i+=1 42 43 if __name__ == '__main__': 44 event = threading.Event() 45 Light = threading.Thread(target=light) 46 Light.start() 47 for i in range(3): 48 t = threading.Thread(target=car,args=(i,)) 49 t.start() 50
