一、通過Event來實現兩個或多個線程間的交互,下面是一個紅綠燈的例子,即起動一個線程做交通指揮信號燈,一個線程做車輛,車輛行駛按紅燈停,綠燈行的規則。
#!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 時間: 2018-11-21 # 郵箱:1209989516@qq.com # 這是我用來練習python線程鎖的測試腳本 import threading,time import random def light(): if not event.isSet(): #如果沒有設定event event.set() #wait就不阻塞 #綠燈狀態 count = 0 while True: if count < 10: print("\033[42;1m--green light on--\033[0m") elif count <13: print("\033[43;1m--yellow light on --\033[0m") elif count <20: if event.isSet(): event.clear() print("\033[41;1m--red light on-- \033[0m") else: count = 0 event.set() #打開綠燈 time.sleep(1) count +=1 # def car(n): # while 1: # time.sleep(random.randrange(10)) # if event.isSet(): #綠燈 # print("car [%s] is running.." %n) # else: # print("car [%s] is waiting for the red light.." %n) def car(n): #no bug version while 1: time.sleep(1) #讓車慢點if event.isSet(): #綠燈 print("car [%s] is running.." %n) else: print("car [%s] is waiting for the red light.." %n) event.wait() #不斷檢查flag有沒有被設定,如果沒有設定就等着,這個是輸入event等待時間,可以精確到毫秒級 if __name__ == "__main__": event = threading.Event() Light = threading.Thread(target=light) Light.start() for i in range(3): t = threading.Thread(target=car,args=(i,)) t.start()
執行結果:
--green light on-- --green light on-- car [0] is running.. --green light on-- car [0] is running.. --green light on-- car [2] is running.. --green light on-- --green light on-- --green light on-- car [2] is running.. --green light on-- car [2] is running.. --green light on-- --green light on-- car [1] is running.. car [0] is running.. --yellow light on -- car [0] is running.. --yellow light on -- car [0] is running.. --yellow light on -- --red light on-- --red light on-- --red light on-- car [1] is waiting for the red light.. --red light on-- car [0] is waiting for the red light.. --red light on-- car [2] is waiting for the red light.. --red light on-- --red light on-- --green light on-- --green light on-- car [2] is running.. --green light on-- car [1] is running.. --green light on-- --green light on-- car [1] is running.. --green light on-- car [0] is running.. --green light on-- --green light on--
...
