python中多執行緒中event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)
阿新 • • 發佈:2018-12-09
event是python中一個特有的標誌位方法,他一共有三種方法
1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定
2.event.set():設定標誌位
3.event.clear():清除標誌位
這一種機制很類似於java中的等待喚醒機制,我們可以試想一下,我們在一個執行緒中,不斷的設定和清除標誌位,在另一個執行緒中用wait()方法,當設定標誌位的時候另一個執行緒就會執行,當清除標誌位的時候,另一個執行緒就會停止,從而實現對一個執行緒的控制。
下面我們通過一個示例程式碼對其進行詳細的解釋:
#在這裡我們模仿一個紅綠燈的應用場景,綠燈亮的時候,車可以通過,紅燈亮的時候要等待。 import time import threading event = threading.Event()#首先要獲取一個event物件 def lighter(): count = 0 event.set() #先設定綠燈 while True: if count >5 and count < 10: #改成紅燈 event.clear() #把標誌位清了 print("紅燈") elif count >10: event.set() #變綠燈 count = 0 else: print("綠燈") time.sleep(1) count +=1 def car(name): while True: if event.is_set(): #代表綠燈 print("[%s] 正在開過"% name ) time.sleep(1) else: print("[%s] 正在等待" %name) event.wait()#車的這個執行緒就鎖在這裡不動了,一直到set的時候,才會繼續執行car的這個執行緒 light = threading.Thread(target=lighter,) light.start() car1 = threading.Thread(target=car,args=("賓士",)) car1.start()
結果:
綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
紅燈[賓士] 正在等待
紅燈 紅燈 紅燈 綠燈 [賓士] 正在開過 綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
綠燈[賓士] 正在開過
紅燈[賓士] 正在等待
紅燈 紅燈 紅燈 綠燈 [賓士] 正在開過 綠燈[賓士] 正在開過
[賓士] 正在開過綠燈
[賓士] 正在開過綠燈
[賓士] 正在開過綠燈
[賓士] 正在開過綠燈
[賓士] 正在開過紅燈