事件Event 线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状 态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中 的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象 中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直 阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线 程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行
Event()可以创建一个事件管理标志,该标志(event)默认为False,event 对象主要有四种方法可以调用:
1.event.wait(timeout=None):调用该方法的线程会被阻塞,如果设置了timeout 参数,超时后,线程会停止阻塞继 续执行;
2.event.set():将event 的标志设置为True,调用wait 方法的所有线程将被唤醒;
3.event.clear():将event 的标志设置为False,调用wait 方法的所有线程将被阻塞;
4.event.is_set():判断event 的标志是否为True。
#线程1,门,一开始是打开的 每3秒需要自动关闭一次 如果有人通过需要重新刷卡打开 #线程2,人,人通过门,如果门是打开的则直接通过,如果没有打开需要刷卡 之后门就打开了 之后通知人继续进入 import threading import time import random #随机数模块 status=0 #status代表门的状态 如果0-3代表打开 如果等于3 代表需要关闭 event=threading.Event() #创建一个事件 事件的默认为假 event.set() #设置标志为真 门一开始是打开状态 def door(): global status while True: print("当前门的状态为:{}".format(status)) if status>=3: print("当前门已经打开了3秒,需要自动关闭") event.clear() if event.is_set(): print('当前门状态是打开,可以通行!') else: print('门已经关闭,请用户刷卡!') event.wait() #门的线程阻塞等待 continue time.sleep(1) status+=1 #status代表开始的秒数 def person(): global status n=0 #人的计数器 看看有多少个人进入 while True: n+=1 if event.is_set(): print('门开着,{}号人进入门里'.format(n)) else: print('门关着,{}号人刷卡之后,进入门里边'.format(n)) event.set()#标志改为True status=0 time.sleep(random.randint(1,10)) if __name__ == '__main__': d=threading.Thread(target=door) p=threading.Thread(target=person) d.start() p.start()