十一、Event

Event

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。

'''
1. Event对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。



2. 在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。



3. 一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。



4. 如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行
'''
  1. 语法:
from threading import Event

# 创建一个Event对象 
event = Event()

一、方法介绍

'''
event.isSet()/is_set:返回event的状态值;

event.wait():如果 event.isSet()==False将阻塞线程,event,isSet()==True则继续运行线程

event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;

event.clear():恢复event的状态值为False。

二、案例:Event

from threading import Event, Thread
import time


event = Event() # 相当于创建了一个红绿灯


def light():
    print('红灯亮')
    time.sleep(3)   # 红绿灯切换时间
    print('绿灯亮')
    # 告诉等待红灯的行人可以走了
    event.set()


def car(name):
    print('{} 正在等红灯'.format(name))
    event.wait()    # 等待别人通知,如果为True则线程继续运行,如果为False则线程阻塞
    print('{} 行动'.format(name))


if __name__ == '__main__':
    t = Thread(target=light)
    t.start()
    # 红绿灯可以只有一个,但是车需要定义多个
    l = []
    for i in range(20):
        t1 = Thread(target=car, args=('车{}'.format(i),))
        t1.start()
        l.append(t1)
    for i in l:
        i.join()
posted @ 2021-06-04 00:04  zzwYYYYYY  阅读(75)  评论(0)    收藏  举报