本程序參考鏈接https://www.cnblogs.com/chengd/articles/7770898.html
在學習查閱別人的代碼時,對threading.Event有疑問,認真研究了一下下,故記錄下來
以下為個人理解,如有不恰當的地方,歡迎指出來,謝謝
Python threading模塊提供Event對象用於線程間通信。用於主線程控制其他線程的執行,事件主要提供了四個方法wait、clear、set、isSet
- set():可設置Event對象內部的信號標志為True
- clear():可清除Event對象內部的信號標志為False
- isSet():Event對象提供了isSet()方法來判斷內部的信號標志的狀態。當使用set()后,isSet()方法返回True;當使用clear()后,isSet()方法返回False
- wait():該方法只有在內部信號為True的時候才會被執行並完成返回。當內部信號標志為False時,則wait()一直等待到其為True時才返回
通過Event來實現一個紅綠燈例子,
即啟動一個線程做交通指揮燈,生成幾個線程做汽車,汽車行駛按照紅燈停綠燈行的規則
1 #cherry_cui 2 3 4 import threading, time # 導入所需的模塊 5 import random 6 7 8 def light(): # 定義light函數 9 if not event.isSet(): 10 event.set() # 初始化isSet()為True:若isSet為True,不執行set();若isSet為False,執行set() 11 count = 0 12 while True: 13 if count < 10: 14 print('\033[42;1m---green light on---\033[0m') 15 elif count < 13: 16 print('\033[43;1m---yellow light on---\033[0m') 17 elif count < 20: 18 if event.isSet(): # 若isSet()為True,執行clear(),isSet()返回False 19 event.clear() 20 print('\033[41;1m---red light on---\033[0m') 21 else: 22 count = 0 23 event.set() # 打開綠燈 24 time.sleep(1) # 休眠1s才能讓car()有機會獲取CPU的執行權 25 count += 1 26 27 28 def car(n): # 定義car函數 29 while 1: 30 time.sleep(random.randrange(3, 10)) # 休眠3s到10s(隨機)才能讓light()有機會獲取CPU的執行權 31 print(event.isSet()) # 打印當前light()中isSet的狀態 32 if event.isSet(): # 獲取light()中isSet的狀態,若為True則執行下一個語句 33 print("car [%s] is running..." % n) 34 else: 35 print('car [%s] is waiting for the red light...' % n) # event.wait() #紅燈狀態下調用wait方法阻塞,汽車等待狀態 36 37 38 if __name__ == '__main__': 39 car_list = ['aa', 'bb', 'cc'] # 定義car數組 40 event = threading.Event() # 通過threading.Event()生成一個event對象和對象的引用event 41 42 Light = threading.Thread(target=light) # 創建一個以light為目標的線程任務 43 Light.start() # 啟動Light線程 44 45 for i in car_list: # 遍歷car數組 46 t = threading.Thread(target=car, args=(i,)) # 創建一個以car方法的線程任務,傳car數組的數據給car() 47 t.start() # 啟動t線程
運行結果:


在本程序中,新學習到的地方,記錄如下:
- Python輸出文字顏色的設置

- Python標准庫 threading.Thread
使用Thread類創建線程
t = threading.Thread(target=car, args=(i,)) t.start()
t= Thread(target=function_name, args=(function_parameter1, function_parameterN))
function_name:需要線程去執行的方法名
args:線程執行方法接收的參數,該屬性是一個元組,若只有一個參數則需要在末尾加逗號
start():為啟動進程
