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 11 Python
解析Python编程中的包结构
Oct 25 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
python多进程并行代码实例
Sep 30 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python如何执行精确的浮点数运算
Jul 31 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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
JavaScript实现删除电脑的关机键
2016/07/26 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
Python的动态重新封装的教程
2015/04/11 Python
python简单实现旋转图片的方法
2015/05/30 Python
python+mysql实现教务管理系统
2019/02/20 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
python 遍历pd.Series的index和value
2019/11/26 Python
C语言变量的命名规则都有哪些
2013/12/27 面试题
什么是Rollback Segment
2013/04/22 面试题
英语专业应届生求职信范文
2013/11/15 职场文书
境外导游求职信
2014/02/27 职场文书
财产公证书格式
2014/04/10 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB