Python 多线程 Event

这篇具有很好参考价值的文章主要介绍了Python 多线程 Event。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Event(事件)

Event 是一个事务处理的机制,用于通知多个异步任务某个事件已经发生了。比如在交通红绿灯中多辆在行驶中的汽车可以表示成程序中的多个异步任务,红绿灯的亮起可以表示成一个通知,红灯通知这个汽车的行驶任务必须停止了,绿灯通知这个汽车的行驶任务可以继续驾驶了。

Event 管理着一个全局的内部标志 flag,该 flag 默认为 False,当 flag 等于 False 的时候,调用 wait() 函数后程序就会被阻塞,只有当 flag 等于 True 的时候程序才会继续执行。在红绿灯中红灯相当于 flag 等于 False 的时候调用了 wait() 函数,绿灯相当于 flag 被设置为了 True,汽车允许通行,程序被允许执行 wait()之后的代码。

Event事件对象

Event 通过 threading 模块的 Event() 类创建对象

event = threading.Event()

Event 是一个低配版的 Condition,在源代码 init 函数中创建了 Condition 对象,并将 flag 设置为 False

def __init__(self):    self._cond = Condition(Lock())    self._flag = False

函数

Event 事件中只有4个函数:

  1. set(): 将 flag 设为 True,通知所有处于阻塞状态的线程恢复运行状态。

  2. clear(): 将 flag 设为 False。

  3. wait(timeout): 如果 flag 为 True 将立即返回,否则线程将处于阻塞状态,等待其他线程将 flag 设置为 True

  4. isSet(): 获取 flag 的状态,返回 True 或 False。

实例1

用行驶中的汽车碰到红绿灯做一个实例,红灯事件汽车停止不允许通行处于等待阻塞状态,绿灯事件汽车运行通行处于恢复运行状态。​​​​​​​

import threadingimport timeevent = threading.Event()def drive(name):    i = 0    while True:        i = i + 1        print(name + "正在行驶中,行驶了" + str(i * 60) + "Km")        time.sleep(1)        event.wait()        print(name + "通过了红灯")def sign():    print("绿灯初始化")    event.set()    while True:        # 红绿灯切换时间为3秒        time.sleep(3)        if event.isSet():            print("红灯亮起,所有行驶中的车辆不允许通过")            event.clear()        else:            print("绿灯亮起,所有行驶中的车辆必须通过")            event.set()if __name__ == '__main__':    # 设置公路线程组    highwayThreads = []    # 创建汽车新线程    bmwCar = threading.Thread(target = drive, args = ("BMWCar", ))    vwCar = threading.Thread(target = drive, args = ("VWCar", ))    # 将汽车线程添加到公路线程组    highwayThreads.append(bmwCar)    highwayThreads.append(vwCar)    # 汽车启动    for thread in highwayThreads:        thread.start()    # 红绿灯发送事件通知    sign()

运行结果:​​​​​​​

绿灯初始化BMWCar正在行驶中,行驶了60KmVWCar正在行驶中,行驶了60KmBMWCar通过了红灯BMWCar正在行驶中,行驶了120KmVWCar通过了红灯VWCar正在行驶中,行驶了120KmBMWCar通过了红灯BMWCar正在行驶中,行驶了180KmVWCar通过了红灯VWCar正在行驶中,行驶了180Km红灯亮起,所有行驶中的车辆不允许通过绿灯亮起,所有行驶中的车辆必须通过VWCar通过了红灯VWCar正在行驶中,行驶了240KmBMWCar通过了红灯BMWCar正在行驶中,行驶了240KmVWCar通过了红灯VWCar正在行驶中,行驶了300KmBMWCar通过了红灯BMWCar正在行驶中,行驶了300KmVWCar通过了红灯VWCar正在行驶中,行驶了360KmBMWCar通过了红灯BMWCar正在行驶中,行驶了360Km红灯亮起,所有行驶中的车辆不允许通过绿灯亮起,所有行驶中的车辆必须通过VWCar通过了红灯VWCar正在行驶中,行驶了420KmBMWCar通过了红灯

实例2

面试题:有两个线程 A、B,A 线程打印 a,b,c 的字母,B线程打印 2,4,6 的数字,A、B 线程将轮询打印,如:a2 b4 c6...​​​​​​​

import threadingfrom threading import Event# 打印字母函数def printLetter(letterEvent, numEvent):    for item in ["a", "b", "c"]:        letterEvent.wait()        print(item, end="")        letterEvent.clear()        numEvent.set()# 打印数字函数def printNum(numEvent, letterEvent):    for item in [2, 4, 6]:        numEvent.wait()        print(item, end=" ")        numEvent.clear()        letterEvent.set()if __name__ == '__main__':    letterEvent, numEvent = Event(), Event()    t1 = threading.Thread(target = printLetter, args = (letterEvent, numEvent))    t2 = threading.Thread(target = printNum, args = (numEvent, letterEvent))    threads = []    threads.append(t1)    threads.append(t2)    for t in threads:        t.start()    letterEvent.set()

运行结果:文章来源地址https://www.toymoban.com/news/detail-482603.html

a2 b4 c6

到了这里,关于Python 多线程 Event的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring中事务失效的8中场景 对于一个事务开子线程

    1. 数据库引擎不支持事务 这里以 MySQL为例,MyISAM引擎是不支持事务操作的,一般要支持事务都会使用InnoDB引擎,根据MySQL 的官方文档说明,从MySQL 5.5.5 开始的默认存储引擎是 InnoDB,之前默认的都是 MyISAM,所以这一点要值得注意,如果底层引擎不支持事务,那么再怎么设置也

    2024年02月16日
    浏览(40)
  • 5.9.Webrtc线程事件处理

    在前面的课程中呢,我已经向你介绍了事件处理的一些基础知识,那今天呢,我们再来看一下外边儿rtc下事件处理的基本逻辑是什么? 那首先呢,我们来看一下事件是如何协调线程工作的,那就如果这张图所展示的有两个线程,对吧?一个是限定线程,一个是工作线程。其中

    2024年02月09日
    浏览(42)
  • 鸿蒙harmony--线程间处理和发送事件Emitter

    想的太多生活中就全是问题,可当你开始行动,这些问题其实都是有答案的,解决焦虑的最好方式,就是把所有的问题都落实到行动上,当你真正开始行动起来,你就会发现这些问题,其实都不是问题! 目录 一,定义 二,主要API 2.1EventPriority 2.2 emitter.on  2.3 emitter.once 2.4 

    2024年01月20日
    浏览(36)
  • c#事件(event)

    C#中的事件是一种特殊的委托,它用于实现观察者模式,允许对象在特定事件发生时通知其他对象。 以下是使用C#事件的示例: 首先,定义一个包含事件的类: 在上面的代码中,我们定义了一个EventPublisher类,其中包含一个名为MyEvent的事件。该事件基于EventHandler委托类型,它

    2024年02月10日
    浏览(45)
  • C#事件event

    事件模型的5个组成部分 事件拥有者(event source)(类对象)(有些书将其称为事件发布者) 事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。) 事件响应者(event subscriber)(类对象)(有

    2024年02月09日
    浏览(51)
  • C#事件(event)的理解

    遇到一个开发的问题? 面试者:以面向对象的思想实现一下的场景: 猫:Miao一声,紧接着引发了一系列的行为~ Miao:引发了一系列的动作; 从代码层面来说:代码这样写好吗? 猫职责不单一(猫就是猫,他的行为只有Miao一声) 依赖太重,依赖了很多的普通类; 被依赖的类

    2024年03月09日
    浏览(60)
  • JS 之 事件Event对象详解(属性、方法、自定义事件)

    一、Event对象 1、简介 ​ 事件 event 对象是指在浏览器中触发事件时,浏览器会自动创建一个 event 对象,其中存储了本次事件相关的信息,包括事件类型、事件目标、触发元素等等。浏览器创建完 event 对象之后,会自动将该对象作为参数传递给绑定的事件处理函数,我们可以

    2024年02月09日
    浏览(68)
  • C# 深入理解事件(event)机制

    目录 一,引言 二,事件的定义和用法 2.1 同步事件执行  2.2 异步事件执行 2.3 等待异步事件完成 2.4 捕获异常处理中的异常 三,事件的综合案例 3.1 需求:汽车出停车场时收费,开闸放行 都知道事件的本质是一个多播委托(MulticastDelegate),但对于事件的机制和用法一直懵懵

    2024年02月16日
    浏览(45)
  • 【Spring源码】Spring Event事件

    目录 1、前言 2、什么是Spring Event? 3、基本使用 3.1、定义事件 3.2、发布事件 3.3、监听事件 3.3.1、继承ApplicationListener 3.3.2、使用@EventListener注解 4、Spring Event是同步还是异步? 4.1、源码实现 4.2、如何实现异步 4.2.1、使用@Async注解 4.2.2、手动实现异步线程池 4.2.3、自定义Appli

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包