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中的字典遍历备忘
Jan 17 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
设置python3为默认python的方法
Oct 31 Python
在python中实现对list求和及求积
Nov 14 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
django项目中新增app的2种实现方法
Apr 01 Python
Python try except else使用详解
Jan 12 Python
Django基础CBV装饰器和中间件
Mar 22 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
Python入门篇之函数
2014/10/20 Python
详解python算法之冒泡排序
2019/03/05 Python
详解Python 解压缩文件
2019/04/09 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
YII2 全局异常处理深入讲解
2021/03/24 PHP
白酒市场开发计划书
2014/01/09 职场文书
趣味活动策划方案
2014/02/08 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
学生安全承诺书
2014/05/22 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
工作保证书
2015/01/17 职场文书
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏
SQL Server Agent 服务无法启动
2022/04/20 SQL Server
MySQL的存储过程和相关函数
2022/04/26 MySQL