您好,欢迎访问一九零五行业门户网

python多线程之事件Event的使用详解

本篇文章主要介绍了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 import threading import time event = threading.event() def chihuoguo(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) # 开启线程 for thread in threads: 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 import threading import time event = threading.event() def chihuoguo(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) class mythread (threading.thread): # 继承父类threading.thread def __init__(self, name): '''重写threading.thread初始化内容''' threading.thread.__init__(self) self.people = name def run(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) # 开启线程 for thread in threads: 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交流群:226296743
1516780957.47 小伙伴 b 开始吃咯!结束线程: thread-3
qq交流群:226296743
结束线程: thread-2
相关推荐:
python线程池threadpool的实现
以上就是python多线程之事件event的使用详解的详细内容。
其它类似信息

推荐信息