
python-threading.Event实现事件功能
enent可以通过设置、等待、清除一个标识(flag),来进行线程间的控制
线程可以通过获取这个标志位(flag)的状态(设置或未设置)来控制线程
事件其实就相当于一个全局变量(设置为True,未设置为False),线程通过这个全局变量的状态来控制自身
event只要set,clear,wait三个方法
使用前先实例化event = threading.Event()
event.wait()#线程阻塞,等待标志位被设置
event.set()#设置标志位
event.clear()#清除标志位
enent.isSet()#标志位是否被设置
红绿灯事件模型,设置一个全局event,红绿灯进程按照时间改变event值,车辆进程根据event值作出相应动作。
import threading import time,random event = threading.Event() #set为绿灯,clear为红灯 def light(): count = 0 if not event.isSet(): event.set()#设置初始状态为绿灯 while True: if count <10: #绿灯 print('\033[1;42;1m绿灯-可以通行 %s\033[0m'%count) event.set() elif count <13: #黄灯 print('\033[1;43;1m黄灯 %s\033[0m' % count) elif count <25: #红灯 print('\033[1;41;1m红灯-禁止通行 %s\033[0m' % count) event.clear() else: count = 0 event.set() count +=1 time.sleep(1) def car(n): while True: time.sleep(1)#random.randrange(3) if event.isSet():#绿灯状态 print('car[%s] is running...'%str(n)) #event.wait() else: print('car[%s] is waitting ...'%str(n)) event.wait()#阻塞等待标志位被设定 def main(): t_light = threading.Thread(target=light) t_light.start() for i in range(3): t_car = threading.Thread(target=car,args=(i,)) t_car.start() main()