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实现中文分词FMM算法实例
Jul 10 Python
python版本的读写锁操作方法
Apr 25 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
浅谈Python中对象是如何被调用的
Apr 06 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语法(4)
2006/10/09 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP 图片水印类代码
2012/08/27 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php集成动态口令认证
2016/07/21 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
Javascript模板技术
2007/04/27 Javascript
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
jQuery事件对象总结
2016/10/17 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
党员的自我评价范文
2014/01/02 职场文书
公司授权委托书范文
2014/09/21 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
团代会闭幕词
2015/01/28 职场文书