threading模塊的threading.Event方法_模擬紅綠燈程序


本程序參考鏈接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線程
View Code

 

 運行結果:

 

 在本程序中,新學習到的地方,記錄如下:

 

  • 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():為啟動進程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM