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之总结参数的传递
Oct 10 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
wxPython之解决闪烁的问题
Jan 15 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python笔记之facade模式
Nov 20 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
Python开发简易五子棋小游戏
May 02 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
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
AngularJS内置指令
2015/02/04 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python基础教程之字典操作详解
2014/03/25 Python
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Mac 上切换Python多版本
2017/06/17 Python
python实现百度语音识别api
2018/04/10 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
艺人经纪人岗位职责
2014/04/15 职场文书
护士医德医风心得体会
2016/01/25 职场文书