# 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态 #举个例子,比如红绿灯是一个线程,三辆汽车是3个线程,如果为红灯,则三个汽车的线程必须 #要停止,如果是绿灯,则三个汽车的线程就可以跑起来 import threading #创建一个事件 event = threading.Event() #如果标签没有设置,则线程会一直等待,直到标签的状态被设置,如果设定了标签,则这里的 #wait就不阻塞了,该动作什么都不做,如果没有设置,则该wait这里就一直阻塞,无论有多线程 #都可以等待一个事件 # event.wait() #设定标签和清空标签 event.set() event.clear() #下面是一个红绿灯例子,很有意思 # import threading # import time # import random # def light(): # #定义了一个灯的函数 # if not event.is_set(): #如果事件未定义,则设置该标签,设置该标签,则如果有线程在等待这个标签,就不会出现阻塞,也就是说初始状态是绿灯 # event.set() # count = 0 # while True: # if count < 10: # #如果事件小于10,则不对事件做任何处理 # print("\033[42;1m----green light on----\033[0m") # elif count < 15: # #如果事件小于15,则不对事件做任何处理 # print("\033[43;1m----yellow light on----\033[0m") # elif count < 20: # #如果事件小于20,也就是说如果时间在15和20之间,则进入红灯状态,如果是红灯状态,则汽车就要阻塞,要实现阻塞,我们就需要对事件设置状态 # if event.is_set(): # event.clear() # print("\033[41;1m----red light on----\033[0m") # else: # count = 0 # event.set() # time.sleep(1) # count += 1 # # def car(n): # while 1: # time.sleep(1) # if event.is_set(): # #如果事件设置了状态,则后面的语句不阻塞,照常执行 # print("cat [%(name)s] is running" %{"name":n}) # else: # event.wait() # #如果这个时间没有设置状态,则该事件一直阻塞在这里,等待该事件被设置状态 # print("cat [%(name)s] is wait for red light" % {"name": n}) # # if __name__ == '__main__': # event = threading.Event() # Light = threading.Thread(target=light) # Light.start() # for i in range(3): # t = threading.Thread(target=car,args=[i,]) # t.start() # import threading import time import random # 1、我们先定义一个灯的函数,由灯的线程去调用这个函数,绿灯是允许通过,红灯是不允许通过,其中绿灯10s,红灯也是10s,这里我们就要用到事件 # 如果是绿灯,我们则设置事件的状态,如果是红灯,我们则取消事件的状态,初始状态为红灯 def light(): if event.is_set(): #设置初始状态,该初始状态为事件没有状态,则进程一直会阻塞 event.clear() count = 0 while True: #进入交通灯灯循环的状态 if count < 10: print("\033[41;1m----red light on----\033[0m") elif count < 20: print("\033[42;1m----green light on----\033[0m") if not event.is_set(): event.set() else: pass else: count = 0 if event.is_set(): event.clear() count += 1 time.sleep(1) def car(n): while True: time.sleep(1) if event.is_set(): print("car [%(name)s] is running" %{"name":n}) else: print("car [%(name)s] is waiting for red light" % {"name": n}) event.wait() # 2、我们在定义一个车的函数,由车的线程去调用这个函数 if __name__ == '__main__': light_thread = threading.Thread(target=light) light_thread.start() for i in range(3): t = threading.Thread(target=car, args=[i,]) t.start()