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

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

引言

继续介绍关于多线程同步的实现方式,本文将介绍基于Event的线程同步方式。

本文的主要内容有:

1、什么是Event

2、Event的使用场景

3、Event的代码实例

4、Event与Condition的比较

什么是Event

在Python的多线程编程中,Event是一个用于实现线程间通信的同步原语。它提供了一种机制,能够允许一个线程通知一个线程或多个线程某个等待事件的发生。

Event对象维持了一个标记,这个标记可以被置为“设置”或者“未设置”。

45d6a314deadd7c8edd7191c9b2466b1.jpeg

b978b52fec1193834915334748ec2596.jpeg

从Event的源码中,可以看出Event内部持有一个Condition对象,相关的实现也是基于Condition来实现的。

Event的支持的主要操作,对应到具体的方法分别是:

1、set()方法:将事件对象标记为“设置”,并通知所有等待该事件的线程。

2、clear()方法:将事件对象标记为“未设置”,使得后续的等待变得有效。

3、is_set()方法:用于检查事件对象的当前状态。

4、wait(timeout=None)方法:阻塞调用的线程,直到事件对象被“设置”,或者达到超时时间。

Event的使用场景

Event主要用于多线程编程场景中的线程间通信与同步,具体来说,可以在以下场景中,尝试使用Event:

1、线程间的步调协调:比如一个线程在执行完某项任务后,希望通知其他线程可以继续执行后续的动作了。

2、等待某个条件:多个线程可能需要等待某个条件(如前置数据的准备、可用资源条件的满足等)才能继续执行。

3、管理线程的生命周期:可以用于控制线程何时开始或者何时结束工作。

从事件语义上来说,Event更适合线程之间存在前置依赖等关系中的线程协同,与Condition条件变量,也有类似的需求场景。

Event的代码实例

接下来,通过代码来演示事件Event的使用:

from threading import Event, Thread
import time


def collect(event):
    print('采集任务:准备采集数据')
    time.sleep(1)
    print('采集任务:数据采集完成,可以进行数据处理了')
    event.set()


def process(event):
    print('处理任务:等待数据采集完成')
    event.wait()
    print('处理任务:接收到数R据采集完成的事件通知')
    print('处理任务:开始数据处理')
    time.sleep(1)
    print('处理任务:数据处理完成')


if __name__ == '__main__':
    collect_finish = Event()
    Thread(target=collect, args=(collect_finish, )).start()
    Thread(target=process, args=(collect_finish, )).start()

代码中简单模拟了数据处理任务有个前置依赖任务:数据采集任务。

数据采集完成事件发生时,则表示数据采集完成,可以开始进行数据处理的任务了。

执行结果:

894ce0ac56683cd58044a157b5acc1ed.jpeg

Event与Condition的比较

在设计及使用中,Event和Condition还是比较相近的,接下来,简单比较一下这两者的区别与联系。

两者相似的地方在于,都是用于进行多线程的通信与同步,在一些简单的同步场景中,两者是可以互换的。

两者的区别主要有:

1、原语的复杂性

Condition提供了一种更加复杂的同步原语,可以支持更加灵活多变的线程间通信的需求。

Event是基于Condition的进一步封装,进一步简化Condition的使用,通过一个单一的状态位设置,提供一种更加简单的同步原语,使用更加简便。

2、通知方式

Condition通过notify()和notify_all()进行相关的同步,更加灵活。

Event通过set()和clear()进行通知的控制。

3、适用场景

Condition可以适用于更复杂的条件等待,比如生产者消费者模式,适合多线程等待不同的条件。

Event更适合简单的线程协调,比如相应的启动信号、停止信号等,通常用于多个线程同时等待同一个事件。

在具体使用中,根据具体的同步需求,来选择更适合的即可。

总结

本文介绍了Event的概念,以及相关的实现及常用操作,并通过一个具体的代码实例演示了Event的使用。最后,比较了Condition和Event的异同,我们在后续的工作场景中,根据实际需要,选择适用的方式即可。

以上就是本文的全部内容,感谢您的拨冗阅读。

e23fcaabf77579ffc5470786a72c02d1.jpeg

实战指南:基于事件驱动实现Dify与企业微信部门数据自动化同步 在企业级应用集成中,打通异构系统的数据孤岛是提升运营效率的关键。其核心原理在于通过API接口与事件驱动架构,实现数据的实时或准实时流动。这种技术方案的价值在于能够自动化业务流程,减少人工干预,确保数据一致性,并为上层应用提供丰富的上下文信息。典型的应用场景包括统一用户身份管理、自动化权限分配以及基于组织架构的个性化服务路由。本文聚焦于将企业微信的组织架构与成员信息同步至低代码AI开发平台Dify这一具体实践,深入解析了如何利用企业微信的通讯录变更事件回调与Dify的用户管理API,构建一个稳定、高效的自动 阅读详情

相关推荐

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 535

python-中断time.sleep一种更优雅的办法:event.wait

中断time.sleep一种更优雅的办法:event.wait

Rnan_prince的博客 5283

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1387

python】详解threading模块:Event类的使用

python 线程 event

weixin_44039930的博客 931

python wait方法_Python事件类| 带有示例的wait()方法

python wait方法 Python Event.wait()方法 (Python Event.wait() Method) wait() is an inbuilt method of the Event class of the threading module in Python. wait()Python中线程模块的Event类的内置方法。 When we want a thre...

1万+

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

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

captain 3029

Python并发编程实战:从多线程、多进程到线程同步与进程通信

并发编程是提升程序性能、处理高并发任务的核心技术,尤其在I/O密集型和计算密集型场景中至关重要。其原理在于通过多线程、多进程或异步I/O等机制,充分利用多核CPU资源,实现任务的并行执行。在Python中,全局解释器锁(GIL)是影响多线程并行能力的关键因素,理解GIL有助于正确选择多线程与多进程方案。线程同步机制如锁(Lock)、信号量(Semaphore)等用于解决竞态条件,确保数据安全;而进程通信(IPC)则通过队列(Queue)、管道(Pipe)等方式实现高效数据交换。这些技术广泛应用于网络爬虫、

weixin_34221112的博客 345

aiohttp学习笔记及RuntimeError: Event loop is closed解决办法(close问题)

aiohttp学习笔记及RuntimeError: Event loop is closed解决办法(close问题) 文章目录aiohttp学习笔记及RuntimeError: Event loop is closed解决办法(close问题)一、概念1.爬虫的基本组成2.同步和异步3.阻塞与非阻塞4.协程5.asyncio6.事件循环7.uvlop8.其他二、示例代码1.aiohttp2.aiohttp添加socks代理3.百度文库列表页代码示例三、踩过的坑代码完全没有问题(参考示例代码1),但会报Ru

L_W_D_的博客 1万+

基于Cpython的全局解释器锁(GIL),死锁和递归锁,信号量, event事件,队列queue几种进出模式

GIL(全局解释器锁) """ In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPyth...

如果我是DJ你会爱我吗 164

IEC 104 系列(五):开发实现——基于 lib60870 的代码实战

本文介绍了基于lib60870开源库开发IEC 104协议Server和Client的核心要点。首先对比了主流开源方案,推荐嵌入式开发首选lib60870(C),原型验证可选py60870,Java后端可选j60870。重点展示了lib60870的项目结构,并详细说明了Server开发流程:包括环境搭建(支持Linux和ARM交叉编译)、最小Server示例实现,涵盖时钟同步和总召唤回调处理。示例代码演示了如何响应主站请求,上送遥信和遥测数据,体现了IEC 104协议的核心功能实现

QAZ600888的博客 553

keybd_event模拟键盘输入

win32api.keybd_event 模拟键盘输入

laiyiru的博客 1万+

事件因果提取论文复现

复现ECE任务,从文本中提取因果事件对及其结构信息

Srlua的博客 1188

python读取windows日志_Python取证技术(3): Windows 事件日志分析

Windows的事件日志都存放在 C:WindowsSystem32winevtLogs目录下。以evtx后缀结尾。事件日志是在windows上记录重要事件发生的特殊文件,当用户登录系统或者程序报错时,就会被记录。对 我的电脑右键菜单管理→事件查看器可以查看。安装python_Evtx直接使用如下命令安装即可。pip install python-evtx如果没有安装pip,下...

weixin_34449520的博客 3754

python飞机大战笔记(4)--监听事件

在游戏循环中监听事件 事件event 就是游戏启动后,用户针对游戏所作的操作; 例如:点击i关闭按钮,点击鼠标,按下键盘… 监听 在游戏循环中,判断用户 具体的操作; 只有捕获到用户具体的操作,才能有针对性的做出响应。 代码实现: pygame中通过pygame.event.get()可以获得用户当前所做动作的事件列表:用户可以同一时做很多事情;这段代码非常的固定,几乎所有的pygame游戏都大...

qq_26126831的博客 647

Python异步Web性能优化:事件循环、连接池与CPU隔离实战

异步I/O是现代Web服务高性能的核心机制,其本质是基于事件循环的协作式调度模型,通过让出控制权实现高并发下的资源复用。理解async/await并非语法糖,而是对非阻塞执行路径的显式声明;掌握数据库连接池、HTTP客户端超时矩阵、文件IO线程池等资源调度策略,可避免连接饥饿、超时级联与事件循环饿死等典型故障。技术价值在于以单线程高效承载数千并发,显著降低延迟与CPU开销。广泛应用于FastAPI、Uvicorn等异步框架的SaaS后台、微服务网关及实时API服务。本文聚焦asyncpg、httpx.Asy

weixin_30516243的博客 337

IEC 104 系列(六):工程实战——部署、冗余与排障

本文摘要:文章详细介绍了电力自动化系统从设计到投运的完整流程,包括需求分析、点表设计、网络规划、设备接入、通信配置、协议开发、联调测试等关键阶段。重点阐述了IEC 104协议中IOA地址的分区规划方案,提供了遥信、遥测、遥控等数据点的Excel模板,并展示了如何通过Python脚本自动生成C语言点表代码。文中还包含各阶段必备交付物清单和系统集成流程图,为工程实施提供了完整的参考框架。

QAZ600888的博客 240

python实现键盘自动输入

Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。 该函数原型如下: VOID keybd_event( BYTE bVk, // virtual-key code BYTE bScan, // hardware scan code...

qq_30653631的博客 2万+

事件溯源与CQRS架构:构建可靠消息传递系统的实战指南

事件溯源(Event Sourcing)是一种架构模式,通过记录不可变的事件序列来重建系统状态,而非直接存储当前状态。其核心原理是将状态变更作为事实事件持久化存储,结合命令查询职责分离(CQRS)模式,实现读写模型的解耦与独立优化。这种架构的技术价值在于天然支持完整审计追溯、容错恢复和业务逻辑演进,尤其适用于分布式系统和微服务场景中需要高可靠消息传递的场景。在实际工程实践中,通过消息持久化机制(如数据库或RabbitMQ、Kafka等中件)确保事件不丢失,并利用事务一致性保障和读模型投影技术,最终可构建出

weixin_33716941的博客 364

工控CTF核心三协议:Modbus、MMS与IEC60870-5-104实战解析

工业控制系统安全能力始于对底层通信协议的深度理解。Modbus作为最广泛部署的工业‘普通话’,其简单性掩盖了厂商私有实现带来的CRC校验偏差、地址映射偏移等真实风险;MMS依托ASN.1与SCL配置,要求攻击者从二进制TLV结构中还原工程语义,考验协议建模与逆向解析能力;IEC60870-5-104则以严苛时序和ASDU可变结构为特征,将漏洞点延伸至VSQ字段越界、心跳超时处理等嵌入式边界场景。这些协议不仅是CTF高频考点,更是电厂、水厂、变电站等关键基础设施中PLC、RTU、SCADA系统的真实交互基础。

weixin_30721077的博客 326

win32键盘输入python_Python win32api.keybd_event模拟键盘输入

win32api.keybd_event该函数原型:keybd_event(bVk, bScan, dwFlags, dwExtraInfo)第一个参数:虚拟键码(键盘键码对照表见附录);第二个参数:硬件扫描码,一般设置为0即可;第三个参数:函数操作的一个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;...

weixin_39717443的博客 1052

Bzier Path Creator

Bzier Path Creator

上一篇: 103、Python并发编程:使用信号量Semaphore实现资源有限的并发场景
下一篇: 105、Python并发编程:化繁为简,通过线程池轻松实现多线程编程
南宫理的日知录
博客等级 码龄16年 2591粉丝 155原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值