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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Python的Flask框架中实现简单的登录功能的教程
Apr 20 Python
详解Django框架中用context来解析模板的方法
Jul 20 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
python实现windows倒计时锁屏功能
Jul 30 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
Python之字典添加元素的几种方法
Sep 30 Python
Django通过设置CORS解决跨域问题
Nov 26 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
构建简单的Webmail系统
2006/10/09 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
JavaScript中for循环的使用详解
2015/06/03 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
深入理解Python中的元类(metaclass)
2015/02/14 Python
python uuid模块使用实例
2015/04/08 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
销售自荐信
2013/10/22 职场文书
总账会计岗位职责
2014/03/13 职场文书
个人年终总结结尾
2015/03/06 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android