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 22 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python如何将多个PDF进行合并
Aug 13 Python
Python3分析处理声音数据的例子
Aug 27 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
序列化Python对象的方法
Aug 01 Python
Django框架请求生命周期实现原理
Nov 13 Python
详解Python中的文件操作
Jan 14 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
javascript类型转换示例
2014/04/29 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python环境变量设置方法
2016/08/28 Python
分析Python中解析构建数据知识
2018/01/20 Python
Python中装饰器学习总结
2018/02/10 Python
python读取中文txt文本的方法
2018/04/12 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
python如何制作英文字典
2019/06/25 Python
python 实现性别识别
2020/11/21 Python
运动会方阵解说词
2014/02/12 职场文书
周年庆典主持词
2014/04/02 职场文书
幼儿园感谢信
2015/01/21 职场文书
感谢信范文大全
2015/01/23 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers