博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python笔记12-python多线程之事件(Event)
阅读量:4323 次
发布时间:2019-06-06

本文共 2656 字,大约阅读时间需要 8 分钟。

前言

小伙伴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-8import threadingimport timeevent = 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-8import threadingimport timeevent = 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-1Thread-3 收到通知了.1516780957.47 小伙伴 c 开始吃咯!Thread-2 收到通知了.qq交流群:2262967431516780957.47 小伙伴 b 开始吃咯!结束线程: Thread-3qq交流群:226296743结束线程: Thread-2

python自动化交流 QQ群:779429633

转载于:https://www.cnblogs.com/yoyoketang/p/8341972.html

你可能感兴趣的文章
/x00
查看>>
数据加载中……显示框
查看>>
判断Http请求由手机端发起,还是有电脑端发起
查看>>
ATMEL处理器自带USB CDC的Win7驱动问题
查看>>
gcc 4.8.5安装
查看>>
time模块
查看>>
db2相关问题及解决方法
查看>>
三、CSS样式——背景
查看>>
UVa 12299 RMQ with Shifts(线段树)
查看>>
BZOJ 3224: Tyvj 1728 普通平衡树(BST)
查看>>
uml建模工具Rational Rose2003使用笔记1
查看>>
Multiple
查看>>
网页开发学习笔记八: css 盒子模型
查看>>
一道课本题目引发的思考的再补充
查看>>
9.25
查看>>
javascript函数
查看>>
java泛型中<?>和<T>有什么区别?
查看>>
Vue.js——60分钟组件快速入门
查看>>
logback配置方式
查看>>
laravel 数据库操作小例子
查看>>