本程序参考链接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():为启动进程