多线程 事件event

发布于:2023-01-12 ⋅ 阅读:(444) ⋅ 点赞:(0)

事件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()

网站公告

今日签到

点亮在社区的每一天
去签到