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计算圆周率pi的方法
Jul 11 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 Python
Python实现的栈(Stack)
Jan 26 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
python去除文件中重复的行实例
Jun 29 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
提取视频中的音频 Python只需要三行代码!
May 10 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
实例解析Array和String方法
2016/12/14 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
Python中的sort()方法使用基础教程
2017/01/08 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
python多维数组切片方法
2018/04/13 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python实现字符串加密成纯数字
2019/03/19 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
详解pandas映射与数据转换
2021/01/22 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
实用的简历自我评价
2014/03/06 职场文书
房屋授权委托书范本
2014/10/07 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js