event事件
事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
event.isSet(): 返回event的状态值; event.wait(): 如果 event.isSet()==False将阻塞线程; event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度; event.clear(): 恢复event的状态值为False。
- clear:将“Flag”设置为False
- set:将“Flag”设置为True
示例:红绿灯
import threading, time import random def light(): if not event.isSet(): ##如果没有设置标志位, event.set() #设置标志位#绿灯状态 count = 0 while True: if count < 10: print('\033[42;1m--green light on---\033[0m') elif count <13: print('\033[43;1m--yellow light on---\033[0m') elif count <20: if event.isSet(): ##判断是否有标志位 event.clear() ##清除标志位,变红灯 print('\033[41;1m--red light on---\033[0m') else: ##count>20 count = 0 event.set() #打开绿灯 time.sleep(1) count +=1 ##汽车先判断是不是绿灯(判断是不是event.isSet,,如果是,则提示绿灯,如果不是,则提示是红灯,等待通行) def car(n): while 1: time.sleep(random.randrange(10)) if event.isSet(): #绿灯 print("car [%s] is running.." % n) else: print("car [%s] is waiting for the red light.." %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,time class Boss(threading.Thread): def run(self): print("BOSS:今晚大家都要加班到22:00。") event.isSet() or event.set() time.sleep(5) print("BOSS:<22:00>可以下班了。") event.isSet() or event.set() class Worker(threading.Thread): def run(self): event.wait() print("Worker:哎……命苦啊!") time.sleep(0.25) event.clear() event.wait() print("Worker:OhYeah!") if __name__=="__main__": event=threading.Event() threads=[] for i in range(5): threads.append(Worker()) threads.append(Boss()) for t in threads: t.start() for t in threads: t.join()
Timer定时器
from threading import Timer def hello(): print("hello, world") t = Timer(5, hello) ##hello为函数名。5为多长时间后执行 t.start()

浙公网安备 33010602011771号