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练习程序批量修改文件名
Jan 16 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Django Highcharts制作图表
Aug 27 Python
python多任务及返回值的处理方法
Jan 22 Python
python命令行参数用法实例分析
Jun 25 Python
200行python代码实现2048游戏
Jul 17 Python
在python中做正态性检验示例
Dec 09 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
用python对oracle进行简单性能测试
Dec 05 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 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
2013/07/08 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
可靠的数据流传输TCP
2016/03/15 面试题
顶岗实习接收函
2014/01/09 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
用人单位聘用意向书
2015/05/11 职场文书
毕业实习感受与体会
2015/05/26 职场文书
公司车辆管理制度
2015/08/04 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js