多線程中的event,用於多線程的協調
阿新 • • 發佈:2018-09-22
true 標誌位 spa top pan target 變化 數據 信號
‘‘‘ 簡單的需求:紅綠燈,紅燈停,綠燈行 一個線程扮演紅綠燈,每過一段時間燈變化,3-5個線程扮演車,紅燈停,綠燈行 紅綠燈線程和車的線程會相互依賴 這種場景怎麽實現?---事件 切換一次燈就是一次事件,這次事件的變化造成其他狀態的變化 事件是用於線程之間的數據同步的。事件變化其他線程相應作出變化 應該設置一個全局變量當做燈,車的線程監測全局變量。 事件就是封裝的一個全局變量 event = threading.event() event.set() 設置標誌位,該狀態下程序激活,“綠燈” event.clear() 清空標誌位,該狀態下程序阻塞,“紅燈” event.wait() 一直監測標誌位。如果標誌位沒被設置就阻塞(紅燈),標誌位一設置就激活(綠燈) event.is_set() 判斷標誌位是否被設定‘‘‘ import time import threading event = threading.Event() def lighter(): count = 0 event.set() # 剛進來的時候是綠燈 while True: if 4 < count < 10: event.clear() print("[信號燈]:紅,不能通行") elif count >= 10: event.set() count = 0else: event.set() print("[信號燈]:綠,可以通行") time.sleep(1) count += 1 def car(name): while True: if event.is_set(): print("{0}: green , running...".format(name)) time.sleep(1) else: print("{0}: RED , STOP...".format(name)) event.wait()print("{0}: 綠燈亮了 , 繼續前進...".format(name)) light = threading.Thread(target=lighter,) light.start() car1 = threading.Thread(target=car, args=("HONDA",)) car1.start()
多線程中的event,用於多線程的協調