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('33[42;1m---green light on---33[0m')
15         elif count < 13:
16             print('33[43;1m---yellow light on---33[0m')
17         elif count < 20:
18             if event.isSet():                     # 若isSet()为True,执行clear(),isSet()返回False
19                 event.clear()
20             print('33[41;1m---red light on---33[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():为启动进程

原文地址:https://www.cnblogs.com/cherrycui/p/9047487.html