Python threading中event的使用
转:https://blog.****.net/mouday/article/details/79146183
https://www.cnblogs.com/alan-babyblog/p/5338146.html
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set
事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
- clear:将“Flag”设置为False
- set:将“Flag”设置为True
event.wait(timeout=None):调用该方法的线程会被阻塞,如果设置了timeout参数,超时后,线程会停止阻塞继续执行;
event.set():将event的标志设置为True,调用wait方法的所有线程将被唤醒;
event.clear():将event的标志设置为False,调用wait方法的所有线程将被阻塞;
event.isSet():判断event的标志是否为True。
红绿灯实例,event事件
import time, threading
event = threading.Event()
# 交通灯
def lighter():
count = 0
while True:
if count < 5: # 绿灯
event.set() #设置标志位
print("\033[42;1m 绿灯亮\033[0m")
elif count > 10:
count =0 # 清零重新计数
else: # 红灯
event.clear() # 清空标志位
print("\033[41;1m 红灯亮\033[0m")
time.sleep(1)
count += 1
# 车辆
def car(name):
while True:
if event.is_set(): # 绿灯亮
print("[%s]绿灯行..." % name)
time.sleep(1)
else:
print("[%s]红灯停!!!" % name)
event.wait() # 等待标志位设定
print("\033[34;1m绿灯出发\033[0m")
# 启动交通灯
t_lighter = threading.Thread(target=lighter)
t_lighter.start()
# 放入车辆
t_car1 = threading.Thread(target=car, args=("奥迪车",))
t_car2 = threading.Thread(target=car, args=("大众车",))
t_car1.start()
t_car2.start()