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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
Python中文编码那些事
Jun 25 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
python3操作微信itchat实现发送图片
Feb 24 Python
Python装饰器语法糖
Jan 02 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python百行代码实现汉服圈图片爬取
Nov 23 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 和 XML: 使用expat函数(一)
2006/10/09 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Python实现求数列和的方法示例
2018/01/12 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
对Python3 序列解包详解
2019/02/16 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
django 模型中的计算字段实例
2020/05/19 Python
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
计算机售后服务承诺书
2014/05/30 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
2015年超市工作总结
2015/04/09 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
Nginx工作原理和优化总结。
2021/04/02 Servers
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python