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计算三角函数之atan()方法的使用
May 15 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
python 不以科学计数法输出的方法
Jul 16 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
一百行python代码将图片转成字符画
Feb 19 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python grpc超时机制代码示例
Sep 14 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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中获取系统信息的方法
2013/06/25 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python yield 使用方法浅析
2017/05/20 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
对python中的装包与解包实例详解
2019/08/24 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
电子商务专员岗位职责
2013/12/11 职场文书
中学教师师德承诺书
2014/05/23 职场文书
作风建设年活动总结
2014/08/27 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
详解JVM系列之内存模型
2021/06/10 Javascript
Vue操作Storage本地化存储
2022/04/29 Vue.js