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()