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模拟鼠标拖动操作的方法
Mar 11 Python
在Python中使用SQLite的简单教程
Apr 29 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python3中eval函数用法使用简介
Aug 02 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
Django框架安装及项目创建过程解析
Sep 14 Python
Pyecharts 中Geo函数常用参数的用法说明
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
帅气的琦玉老师
2020/03/02 日漫
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
python中元类用法实例
2014/10/10 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python实现一个简单的ping工具方法
2019/01/31 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
2014自主招生自荐信策略
2014/01/27 职场文书
财务部总监岗位职责
2014/03/12 职场文书
设备收款委托书范本
2014/10/02 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript