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


Posted in Python onApril 27, 2018

前言

小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现

Event(事件)

Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。

Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。

Event()

  1. set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
  2. clear(): 将标志设为False。
  3. wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
  4. 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 相关文章推荐
Python的垃圾回收机制深入分析
Jul 16 Python
python操作mysql中文显示乱码的解决方法
Oct 11 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python之列表的插入&替换修改方法
Jun 28 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
python+mysql实现教务管理系统
Feb 20 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
python实现简单日志记录库glog的使用
Dec 13 Python
Python yield的用法实例分析
Mar 06 Python
python实现图像全景拼接
Mar 27 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
python tkinter模块的简单使用
Apr 07 Python
python线程池threadpool使用篇
Apr 27 #Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 #Python
python中yaml配置文件模块的使用详解
Apr 27 #Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 #Python
python中subprocess批量执行linux命令
Apr 27 #Python
python复制文件到指定目录的实例
Apr 27 #Python
Python多进程multiprocessing.Pool类详解
Apr 27 #Python
You might like
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
PHP中16个高危函数整理
2019/09/19 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Sanic框架应用部署方法详解
2018/07/18 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
由面试题加深对Django的认识理解
2019/07/19 Python
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
什么是会话Bean
2015/05/14 面试题
施工班组长岗位职责
2014/01/05 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
群众路线党课主持词
2014/04/01 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
2014年学前班工作总结
2014/12/08 职场文书
初三毕业感言
2015/07/31 职场文书