python多线程之事件Event的使用详解
前言
小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现
Event(事件)
Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为False,那么当程序执行event.wait方法时就会阻塞,如果Flag值为True,那么event.wait方法时便不再阻塞。
Event其实就是一个简化版的Condition。Event没有锁,无法使线程进入同步阻塞状态。
Event()
- set():将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
- clear():将标志设为False。
- wait(timeout):如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
- isSet():获取内置标志状态,返回True或False。
Event案例1
场景:小伙伴a和b准备就绪,当收到通知event.set()的时候,会执行a和b线程
#coding:utf-8
importthreading
importtime
event=threading.Event()
defchihuoguo(name):
#等待事件,进入等待阻塞状态
print'%s已经启动'%threading.currentThread().getName()
print'小伙伴%s已经进入就餐状态!'%name
time.sleep(1)
event.wait()
#收到事件后进入运行状态
print'%s收到通知了.'%threading.currentThread().getName()
print'小伙伴%s开始吃咯!'%name
#设置线程组
threads=[]
#创建新线程
thread1=threading.Thread(target=chihuoguo,args=("a",))
thread2=threading.Thread(target=chihuoguo,args=("b",))
#添加到线程组
threads.append(thread1)
threads.append(thread2)
#开启线程
forthreadinthreads:
thread.start()
time.sleep(0.1)
#发送事件通知
print'主线程通知小伙伴开吃咯!'
event.set()
运行结果:
Thread-1已经启动
小伙伴a已经进入就餐状态!
Thread-2已经启动
小伙伴b已经进入就餐状态!
主线程通知小伙伴开吃咯!
Thread-1收到通知了.
小伙伴a开始吃咯!
Thread-2收到通知了.
小伙伴b开始吃咯!
Event案例2
场景:当小伙伴a,b,c集结完毕后,请客的人发话:开吃咯!
#coding:utf-8
importthreading
importtime
event=threading.Event()
defchiHuoGuo(name):
#等待事件,进入等待阻塞状态
print'%s已经启动'%threading.currentThread().getName()
print'小伙伴%s已经进入就餐状态!'%name
time.sleep(1)
event.wait()
#收到事件后进入运行状态
print'%s收到通知了.'%threading.currentThread().getName()
print'%s小伙伴%s开始吃咯!'%(time.time(),name)
classmyThread(threading.Thread):#继承父类threading.Thread
def__init__(self,name):
'''重写threading.Thread初始化内容'''
threading.Thread.__init__(self)
self.people=name
defrun(self):#把要执行的代码写到run函数里面线程在创建后会直接运行run函数
'''重写run方法'''
chiHuoGuo(self.people)#执行任务
print("qq交流群:226296743")
print("结束线程:%s"%threading.currentThread().getName())
#设置线程组
threads=[]
#创建新线程
thread1=myThread("a")
thread2=myThread("b")
thread3=myThread("c")
#添加到线程组
threads.append(thread1)
threads.append(thread2)
threads.append(thread3)
#开启线程
forthreadinthreads:
thread.start()
time.sleep(0.1)
#发送事件通知
print'集合完毕,人员到齐了,开吃咯!'
event.set()
运行结果:
Thread-1已经启动
小伙伴a已经进入就餐状态!
Thread-2已经启动
小伙伴b已经进入就餐状态!
Thread-3已经启动
小伙伴c已经进入就餐状态!
集合完毕,人员到齐了,开吃咯!
Thread-1收到通知了.
1516780957.47小伙伴a开始吃咯!
qq交流群:226296743
结束线程:Thread-1
Thread-3收到通知了.
1516780957.47小伙伴c开始吃咯!Thread-2收到通知了.
qq交流群:2262967431516780957.47小伙伴b开始吃咯!结束线程:Thread-3
qq交流群:226296743
结束线程:Thread-2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。