15-事件(Event类)
python线程的事件用于主线程控制其他线程的执行,事件是一个简单的线程同步对象,其主要提供以下几个方法:
方法 | 注释 |
---|---|
clear | 将flag设置为“False” |
set | 将flag设置为“True” |
is_set | 判断是否设置了flag |
wait | 会一直监听flag,如果没有检测到flag就一直处于阻塞状态 |
事件处理的机制:全局定义了一个“Flag”,当flag值为“False”,那么event.wait()就会阻塞,当flag值为“True”,那么event.wait()便不再阻塞。
- 以下是通过event实现小车根据红绿灯行驶停止的例子
"""
运行两个子线程
线程1:进行红绿灯切换
线程2:根据event控制小车运行还是等待
绿灯0-5 s 小车可以跑起来
红灯6-10 s 小车需要等待
"""
import threading
import time
event = threading.Event()
event.set() # 初始为True
def lighter():
counter = 0
while True:
if 5 < counter <= 10:
# 6-10秒 红灯亮起来
event.clear()
print("\33[41;1m 红灯... \033[0m")
elif counter > 10:
event.set()
counter = 0
else:
# 1-5秒 绿灯
print("\33[42;1m 绿灯... \033[0m")
counter += 1
time.sleep(1)
def car():
while True:
if event.is_set():
# 绿灯
print("小车运行中...")
time.sleep(1)
else:
print("小车等红灯中...")
event.wait()
print("绿灯亮了,小车启动啦!")
if __name__ == '__main__':
lighter_thread = threading.Thread(target=lighter)
lighter_thread.start()
car_thread = threading.Thread(target=car)
car_thread.start()