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

引言

继续介绍关于多线程同步的实现方式,本文将介绍基于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 timedef 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468592.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步:市场趋势判断2.3.2 第二步:竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步:客户分析2.3.4 第四步:产品定义2.3.5 第五步:开发执…

ReactPress数据库表结构设计全面分析

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress是一个基于React框架开发的开源发布平台和内容管理系统(CMS)。它不仅支持用户在支持React和MySQL数据库的服务器上搭建自己的博客和网站&#…

ANDROIDWORLD: A Dynamic BenchmarkingEnvironment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过,是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态,与静态的数据集(比如说我自己的工作)不同,因此…

华为ENSP--ISIS路由协议

项目背景 为了确保资源共享、办公自动化和节省人力成本,公司E申请两条专线将深圳总部和广州、北京两家分公司网络连接起来。公司原来运行OSFP路由协议,现打算迁移到IS-IS路由协议,张同学正在该公司实习,为了提高实际工作的准确性和…

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表 一.简介 在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy; PyMySQL — MySQL 数据库…

ADSP21489 M25P16启动后无法使用USBi的问题

项目背景是ADSP21489 使用SPI MASTER 启动模式,程序存储在M25P16中 编译cces产生运行代码 第二步,插上USBi仿真器下载sigma topo 发现无法正常下载 操作多次发现需要目标板重新上点后需要拔插usbi才能下载和启动dsp程序 原因分析: 就是第一次插上usbi后,在给目标板上电,可…

量子计算包kaiwu安装过程踩过的坑

目录 1 安装过程 2 官方代码测试 3 踩坑说明 首先,目前的kaiwu版本仅支持python3.8,所以必须要下载python3.8才能运行kaiwu 1 安装过程 step1: 在页面的SDK标签下,找到对应操作系统的kaiwu包。 step2: 下载python3.8到本地,可…

线程相关概念

线程概念 线程是操作系统中一种基本的执行单元,是程序的最小调度单位。一个程序可以包含多个线程,每个线程代表一个独立的执行路径,使得程序可以并发地处理多个任务。 线程的基本概念 线程与进程的区别: 进程是资源分配的单位&…

SSH实验5密钥登录Linuxroot用户(免密登录)

当用户尝试通过SSH连接到远程服务器时,客户端会生成一对密钥:公钥和私钥。公钥被发送到远程服务器,并存储在服务器的~/.ssh/authorized_keys文件中。而私钥则由客户端保管,不会传输给服务器。 在连接过程中,客户端使用…

域名邮箱推荐:安全与稳定的邮件域名邮箱!

域名邮箱推荐及绑定攻略?最好用的域名邮箱服务推荐? 域名邮箱,作为一种个性化且专业的电子邮件服务,越来越受到企业和个人的青睐。烽火将详细介绍域名邮箱登录的全过程,从注册到登录,帮助您轻松掌握这一重…

政治经济学笔记

【拯救者】政治经济学速成(基础习题) 研究生产关系必须联系生产力和上层建筑 1.生产力与生产关系 生产力代表生产的物质内容,生产关系是生产的社会形式。生产力决定生产关系,生产关系对生产力具有 反作用 *其中的”反作用”指的是…

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭?基于半关闭…

python | 包

1. 在python中什么是包? ​ 包是一种组织代码的方式,如下图所示红色部分目录mypackage就称为一个包,它之所以称为一个包完全是因为它里面有蓝色方框里的文件__init__.py。 ​ 这个目录被定义为一个包之后,我们就可以通过import来…

Qt信号和槽-->day04

Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目: 题解: const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

腾讯首个3D生成大模型Hunyuan3D-1.0分享

Hunyuan3D-1.0是腾讯混元团队开发的首个同时支持文字、图像转3D的大模型,可以基于文本描述或单张图像生成3D模型。 Hunyuan3D-1.0采用了多视图生成和多视图重建两阶段的方法,能够从不同视角捕捉对象的纹理和几何信息。 在多视图生成阶段,Hu…

【JavaEE初阶 — 多线程】内存可见性问题 volatile

1. 内存可见性问题 内存可见性的概念 什么是内存可见性问题呢? 当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。在Java中,可以借助 synchronized、volatile 以及各种Lock 实现可见性。如果我们将变量声…

排序算法.

排序算法是最常用的一种算法.它解决的主要问题是在一定的时间复杂度和空间复杂度的条件下,对n个数按照一定的顺序进行排序.排序算法主要分为四大类,即插入类,交换类,选择类和归并类,不同的排序算法的时间复杂程度和空间复杂程度差别很大. 排序算法主要有以下几种: 1.插入类排…

iOS18.1通話錄音實測 錄音夠清晰 文字轉錄廣東話用唔到?

iOS 18.1功能實測|期待已久的通話錄音功能終在iOS18.1推出,讓用家可以在通話過程中輕鬆錄音,並附上逐字稿功能,為使用者提供更靈活的通話記錄方式。記者實測通話錄音功能,看看錄音清晰度、方便性、逐字轉錄的表現。 打…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障,说是测试环境的附件上传功能报了 403 的错误,错误信息:403 Request Entity Too Lager。我尝试复现问题,发现传个几兆的文件都费劲啊,一传一个失败。不用说,项目用到 ng 代理&#x…