python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set
事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么执行event.wait 方法时便不再阻塞。
- clear:将“Flag”设置为False
- set:将“Flag”设置为True
用 threading.Event 实现线程间通信,使用threading.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中,
Event默认内置了一个标志,初始值为False。一旦该线程通过wait()方法进入等待状态,直到另一个线程调用该Event的set()方法将内置标志设置为True时,该Event会通知所有等待状态的线程恢复运行。
#!/usr/bin/python3
#_*_ coding: UTF-8 _*_ import threading, time
import random def light():
if not event.isSet():
event.set() #wait就不阻塞 #绿灯状态
count = 0
i=0
while True:
if count <10:
print("---green light on ---")
elif count<13:
print("---yellow light on ---")
elif count <20:
if event.isSet():
event.clear()
print("---red light on ---")
else:
count = 0
event.set()#打开绿灯
time.sleep(1)
count +=1
i+=1
if(i>20):
break
def car(n):
i=0
while 1:
time.sleep(random.randrange(3))
if event.isSet():#如果是绿灯
print("car [%s] is running.."%n)
else:
print("car [%s] is waiting for the red light.."%n)
if(i>10):
break
else:
i+=1 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()