Python 多线程 Event

Python学习,多线程Event,一起来学习吧 Event(事件) Event 是一个事务处理的机制,用于通知多个异步任务某个事件已经发生了。比如在交通红绿灯中多辆在行驶中的汽车可以表示成程序中的多个异步任务,红绿灯的亮起可以表示成一个通知,红灯通知这个汽车的行驶任务必须停止了,绿灯通知这个汽车的行驶任务可以继续驾驶了。 Event 管理着一个全局的内部标志 flag,该 flag 默认为 False,当 flag 等于 False 的时候,调用 wait() 函数后程序就会被阻塞,只有当 flag 等于 True 的时候程序才会继续执行。在红绿灯中红灯 阅读详情

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 threading
import time

event = 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正在行驶中,行驶了60Km
VWCar正在行驶中,行驶了60Km
BMWCar通过了红灯
BMWCar正在行驶中,行驶了120Km
VWCar通过了红灯
VWCar正在行驶中,行驶了120Km
BMWCar通过了红灯
BMWCar正在行驶中,行驶了180Km
VWCar通过了红灯
VWCar正在行驶中,行驶了180Km
红灯亮起,所有行驶中的车辆不允许通过
绿灯亮起,所有行驶中的车辆必须通过
VWCar通过了红灯
VWCar正在行驶中,行驶了240Km
BMWCar通过了红灯
BMWCar正在行驶中,行驶了240Km
VWCar通过了红灯
VWCar正在行驶中,行驶了300Km
BMWCar通过了红灯
BMWCar正在行驶中,行驶了300Km
VWCar通过了红灯
VWCar正在行驶中,行驶了360Km
BMWCar通过了红灯
BMWCar正在行驶中,行驶了360Km
红灯亮起,所有行驶中的车辆不允许通过
绿灯亮起,所有行驶中的车辆必须通过
VWCar通过了红灯
VWCar正在行驶中,行驶了420Km
BMWCar通过了红灯

实例2

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

import threading
from 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()

运行结果:

a2 b4 c6
python线程同步:Threading-Event() set()— 全局内置标志Flag,将标志Flag 设置为 True,通知在等待状态(wait)的线程恢复运行isSet()— 获取标志Flag当前状态,返回True 或者 Falsewait()— 一旦调用,线程将会处于阻塞状态,直到等待其他线程调用set()函数恢复运行clear()— 将标志设置为False。 阅读详情

相关推荐

【杰理AC696X】ADKEY复用指示灯不定时出现灯不亮或按键失灵的问题

测试SDK版本:《ac696n_soundbox_sdk_v1.5.0-20211217》ADKEY复用指示灯的做法多用于蓝牙小音箱,IC引脚越来越少,复用也就用的越多了,不过,在使用前应评估好功能,因为复用的做法,肯定会牺牲点东西的,如果体验感啥的。 比如这个图,(V-)按键按下时,LED是会一直导通发光的,按不同阻值的按键还有亮度不一致的问题,这样的问题有的客户是不接受的,这就要另寻他法了。某天调好案子,放在一边测试时,发现指示灯不亮了,按键也不起作用,想起之前AC692系列也有类似的问题,很快就定位到

xx842678的博客 1653

Python之Event事件(简单教程)

摘要: 同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Even

如有侵权,请联系作者删除 1万+

Isaac Gym摄像头数据获取全攻略:从CPU到GPU,教你实时显示RGB与深度图

本文详细介绍了在Isaac Gym中获取摄像头数据的两种高效方案:CPU模式与GPU张量模式。通过实战代码示例,展示了从摄像头配置、数据获取到实时可视化RGB与深度图的全流程,帮助开发者优化机器人仿真与计算机视觉应用的性能。特别强调了GPU模式下的零拷贝访问与张量运算优势,适用于需要低延迟处理的场景。

weixin_29056701的博客 387

Python多线程同步编程Event使用方法

Event是Python多线程同步编程中的一种同步原语,它可以帮助我们协调多个线程的操作,以达到线程间传递信号、同步操作等目的。Event主要有两种状态:已设置和未设置。当Event被设置时,所有等待该Event的线程都会被唤醒;当Event未被设置时,所有等待该Event的线程都会被阻塞,直到Event被设置。

captain 3052

从NASA官网到分析图:MOD09A1地表反射率数据的完整处理流程(含QC筛选)

本文详细介绍了MOD09A1地表反射率数据的完整处理流程,从NASA官网数据下载到QC筛选,再到NDVI图生成。特别强调了质量控制(QC)信息在筛选可靠像元中的关键作用,帮助研究人员获取高质量遥感数据。

weixin_42542669的博客 110

手把手教你用RK3568开发板实现FPGA与Linux的DMA通信(含完整代码解析)

本文详细介绍了如何在RK3568开发板上实现FPGA与Linux系统的DMA通信,包括硬件配置、软件环境搭建、DMA通信原理、驱动开发及性能优化。通过完整的代码解析和实战案例,帮助开发者快速掌握异构系统间的高效数据传输技术,适用于物联网和边缘计算等场景。

weixin_29174385的博客 201

python中event的用法_Python编程之event对象的用法实例分析

本文实例讲述了Python编程中event对象的用法。分享给大家供大家参考,具体如下:Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号被其他线程设置成真。这一点似乎和windows的event正好相反。 Event对象实现了简单的线程通信机制,它提供了设置信号,清除信号,等待等用于实现线程间的通信。1.设置信号使用Event的set(...

weixin_36044132的博客 3038

python全栈入门到实战【基础篇 03】入门实操:第一个Python程序 + PyCharm使用 + 输入输出全解析

本文是一篇Python入门教程,主要介绍PyCharm编辑器的安装配置和基础使用,以及Python输入输出语法的实操练习。文章分为四个部分:1)PyCharm的下载安装与基础配置;2)第一个Python程序"Hello World"的编写与运行;3)Python输入输出函数print()和input()的详细讲解;4)个人信息录入系统的实战案例。教程包含大量截图和动图演示,适合Python新手跟随操作,快速掌握编辑器使用和基础语法。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4003

python系列——多线程之event事件

参考博客: https://www.cnblogs.com/zhangshengxiang/p/9606133.html (讲述了event和线程之间的关系) https://blog.youkuaiyun.com/beifangdefengchuilai/article/details/80165772 (使用event实现红绿灯) https://www.jianshu.com/p/c8dc6f689915 (使用event实现生产者消费者) event与线程之间的关系: 同进程的一样,线程的一个关...

有信念,才能走的更远 1192

Vue3 - 详细实现微信公众号H5网页内置浏览器中预览下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部直接打开预览和下载到本地教程,安卓苹果手机无差异兼容

vue3,nuxt3,微信公众号,h5,移动端,网页,网站,vue微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,手机系统,微信H5页面,vue3微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,offi

🏆 前端领域优质创作者 1万+

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 237

Python 多线程Event

Event(事件) Event 是一个事务处理的机制,用于通知多个异步任务某个事件已经发生了。比如在交通红绿灯中多辆在行驶中的汽车可以表示成程序中的多个异步任务,红绿灯的亮起可以表示成一个通知,红灯通知这个汽车的行驶任务必须停止了,绿灯通知这个汽车的行驶任务可以继续驾驶了。 Event 管理着一个全局的内部标志 flag,该 flag 默认为 False,当 flag 等于 False 的时候,调用 wait() 函数后程序就会被阻塞,只有当 flag 等于 True 的时候程序才会继续执行。在红绿灯中红灯

python学习者的博客 777

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Python多线程的threading Event

https://www.cnblogs.com/lcchuguo/p/4687348.html

llxx1234的博客 177

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python 多线程编程-04-threading 模块 - Event

在Python 多线程编程-03-threading 模块 - Condition 中介绍了生产者-消费者模式的代码实现,使用了 threading.Condition 来控制同一个资源池的使用,其中的生产者线程和消费者线程是对等的,没有什么主从之分。而 threading.Event 机制类似于一个线程向其它多个线程发号施令的模式,其它线程都会持有一个threading.Event 的对象,这些线程都会等待这个事件的“发生”,如果此事件一直不发生,那么这些线程将会阻塞,直至事件的“发生”。

一分耕耘一分收获 3112

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python的线程10 使用Event保证多线程同时执行

正式的Python专栏第48篇,同学站住,别错过这个从0开始的文章! 前面分享了threading.Event类,它维持了一个信号(True/False)状态。 像田径跑道上蹲在起点的运动员,不分先后,同时听到枪响就开跑,用这个类来做很适合。 模拟:发出一声枪响 当然不是真的有枪响,而且代码调用Event类的对象实例的set函数。 因为Event类的函数是线程安全的,所以我们可以把运动员看成一个一个的线程,并排在跑道起点。 所以这个思路代码就有了 for _ in range(n): def r.

持续学习持续开发,我是雷学委! 2414

python线程同步_python多线程同步---事件 Event

python多线程同步---事件 Event事件 Event是另一种python多线程同步技术, 本文将使用python语言对这种技术进行讲解, 想象这样一个场景,你启动了多个线程,这些线程都要去访问一个资源,但是,这里有一个小小的问题,即将被访问的资源还没有准备好接受访问,那么此时,多个线程去访问,必然得到不响应,你还得处理这种得不到响应的情况1. Event借助Event,可以灵活的协调线程间...

weixin_39517202的博客 161

python中用event标志位来控制多线程

平常编写多线程爆破工具时,线程找到正确的帐户密码时会导出结果,并直接通过os._exit(0)进行脚本退出 自己在编写FTP多线程爆破时,发现多线程进行FTP爆破时候,线程中无法通过os._exit(0)进行脚本正常的退出,只是那个爆破出正确帐户密码的线程会退出,其他的线程还是一直在爆破。 网上找了很多关于多线程退出的资料,发现写的比较多也有点乱。 后来发现了一个不错的方法...

大方子 1167

python中event_Python中多线程事件(Event类)简介说明

摘要:下文讲述Python中多线程事件(Event类)的简介说明,如下所示:python线程的事件用于主线程控制其他线程的执行,事件是一个简单的线程同步对象,其主要提供以下几个方法:clear:将flag设置为“False”set:将flag设置为“True”is_set:判断是否设置了flagwait:会一直监听flag,当未检测到flag就一直处于阻塞状态事件处理的机制:全局定义了一个“Fla...

weixin_42530458的博客 1064

python多线程之Event机制笔记

这是熟悉python 多线程 event机制的学习笔记

wyz0923的博客 680

Python多线程中的join和Event及没有使用join和event区别

join:是等待某一个线程全部执行完才执行下一步。 # -*- coding:utf-8 -*- import time import threading def run(n,event): for i in range(1000): print(i,end=' ') #event.set() while n>0: print('Threading:',n) n -= 1 time.sleep(3) e..

yunerchen的博客 639

详解python多线程、锁、event事件机制的简单使用

线程和进程 1、线程共享创建它的进程的地址空间,进程有自己的地址空间 2、线程可以访问进程所有的数据,线程可以相互访问 3、线程之间的数据是独立的 4、子进程复制线程的数据 5、子进程启动后是独立的 ,父进程只能杀掉子进程,而不能进行数据交换 6、修改线程中的数据,都是会影响其他的线程,而对于进程的更改,不会影响子进程 threading.Thread Thread 是threading模块中最重...

python多线程基础教程进阶教程 831

python3 多线程_python3多线程中的事件Event

前面我把python3中的多线程介绍了下,那就是用threading模块来实现多线程,不过我们注意到该模块并没有提供暂停, 恢复和停止线程的方法,也就是说一旦线程对象调用start方法后,就 只能等到对应的方法函数运行完毕,可以说线程就处于失控状态了。一般为了灵活掌控线程,我们需要想办法实现线程的停止,暂停以及恢复等操作。 首先说说停止,对于线程的停止, 我们倒是可以自己实现,比如定义一个全局标...

weixin_39629876的博客 371

104、Python并发编程:基于事件Event实现多线程间的同步

在Python的多线程编程中,Event是一个用于实现线程间通信的同步原语。它提供了一种机制,能够允许一个线程通知一个线程或多个线程某个等待事件的发生。Event对象维持了一个标记,这个标记可以被置为“设置”或者“未设置”。从Event的源码中,可以看出Event内部持有一个Condition对象,相关的实现也是基于Condition来实现的。1、set()方法:将事件对象标记为“设置”,并通知所有等待该事件的线程。2、clear()方法:将事件对象标记为“未设置”,使得后续的等待变得有效。

南宫理的日知录 1163

python 并发编程 多线程 event

event实现了一个线程通知另外一个线程 线程的一个关键特性是每个线程都是独立运行且状态不可预测。 1.为什么要使用Event对象: 如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 2.Event对象实现原理 对象包含一个可由线程设置的...

weixin_30266829的博客 145
上一篇: Python 线程池
下一篇: Python Requests 库的基本使用
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值