python多线程之事件Event的使用详解

 更新时间:2018年04月27日 09:16:15   作者:上海-悠悠  
本篇文章主要介绍了python多线程之事件Event的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前言

小伙伴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接口自动化浅析logging日志原理及模块操作流程

    Python接口自动化浅析logging日志原理及模块操作流程

    这篇文章主要为大家介绍了Python接口自动化系列文章浅析logging日志原理及模块操作流程,文中详细说明了为什么需要日志?日志是什么?以及日志用途等基本的原理
    2021-08-08
  • Python内存优化的七种技巧分享

    Python内存优化的七种技巧分享

    本文将重点介绍 Python 的内置机制,并介绍 7 种原始但有效的内存优化技巧,掌握这些技巧将大大提高你的 Python 编程能力,文中通过代码示例给大家讲解的非常详细,感兴趣的小伙伴跟着小编一起来学习吧
    2024-02-02
  • python 遍历可迭代对象的实现方法

    python 遍历可迭代对象的实现方法

    本文主要介绍了python 遍历可迭代对象的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python求定积分之quad函数详解

    python求定积分之quad函数详解

    这篇文章主要介绍了python求定积分之quad函数详解,SciPy下实现求函数的积分的函数的基本使用,积分,高等数学里有大量的讲述,基本意思就是求曲线下面积之和,需要的朋友可以参考下
    2023-08-08
  • python中waitKey实例用法讲解

    python中waitKey实例用法讲解

    在本篇文章里小编给大家整理了一篇关于python中waitKey实例用法讲解,有兴趣的朋友们可以参考学习下。
    2021-04-04
  • Python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法汇总

    Python报错TypeError: ‘NoneType‘ object is 

    在Python编程中,TypeError 是一个常见的错误,它表明代码中存在类型不匹配的问题,TypeError: 'NoneType' object is not subscriptable 是一个具体的例子,本文将探讨这个错误的原因,并提供几种解决方案,需要的朋友可以参考下
    2024-10-10
  • Python使用GeoIP2实现地图定位

    Python使用GeoIP2实现地图定位

    GeoIP2是一种IP地址定位库,它允许开发人员根据IP地址查找有关位置和地理位置的信息,这篇文章主要为大家介绍了python如何使用GeoIP2实现地图定位,感兴趣的可以了解下
    2023-10-10
  • 详解如何利用Python装饰器优化代码

    详解如何利用Python装饰器优化代码

    这篇文章主要带大家深入探讨装饰器的应用,包括计时器装饰器和缓存装饰器等的实现,文中的示例代码讲解详细,需要的小伙伴可以参考下
    2023-05-05
  • python格式化输出实例(居中、靠右及靠左对齐)

    python格式化输出实例(居中、靠右及靠左对齐)

    所谓格式化输出就是数据按照某种特殊的格式和要求进行输出,下面这篇文章主要给大家介绍了关于python格式化输出(居中、靠右及靠左对齐)的相关资料,文中介绍了format方式、其他扩展写法以及'%'方式,需要的朋友可以参考下
    2022-04-04
  • Python基础之语法错误和异常详解

    Python基础之语法错误和异常详解

    Python有两种错误很容易辨认:语法错误和异常.本文就给大家详细介绍一下Python错误和异常,对正在学习python的小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-05-05

最新评论