Python的线程09 认识Event信号

本文介绍Python中threading.Event类的基本用法,探讨如何利用Event实现多线程间的同步控制,确保线程能公平竞争。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正式的Python专栏第47篇,同学站住,别错过这个从0开始的文章!

前面分享了多篇文章的线程创建的代码,一个循环创建多个线程并启动,它们并不是保证它们同时开始做一个事情。

怎么样才能保证,多个线程公平公正的竞争呢?

就像田径跑道上蹲在起点的运动员,不分先后,同时听到枪响,就开跑呢?

本文,我们先学习一下threading.Event类。

Event 是什么

写过很多Java应用的同学,我们谈到的Event通常都是一些指令性的消息,比如,转账10元,某某已关注, 而且创建事件后通常不会再进行修改。

不过Python内置的threading.Event类,确实不太一样。

threading.Event类,维护了一个标志位flag变量。提供一系列的函数如把flag的值从False 转变为True。
另外,这个标志位flag对外不开放的,不可直接访问,仅通过is_set()函数查看其状态。

学委认为把Event名字后面加个Signal可能更加合适一些,EventSignal(事件信号)。叫做Event,实在是太过宽泛了。

我们可以对threading.Event持有的flag进行操作:

  • 通过set()函数把Event维护的flag值转变为True;
  • 通过clear()函数把Event维护的flag值变为None。

学委准备了下面的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/27 10:43 下午
# @Author : LeiXueWei
# @优快云/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_event0.py
# @Project : hello
import threading
import time

xuewei_event = threading.Event()

print("event:", xuewei_event)
print("event对应flag 的默认值:", xuewei_event.is_set())

xuewei_event.set()
print("after set, flag:", xuewei_event.is_set())
print("after clear, flag:", xuewei_event.clear())
print("wait 3 second, flag:", xuewei_event.wait(3))
xuewei_event.set()
print("after set, flag:", xuewei_event.is_set())

稍微说明一下,我们在代码创建了一个xuewei_event对象。

然后调用了set()函数,打印出来的xuewei_event的flag值是True的。

然后调用了clear()函数,把对象的flag状态转为了False, 所以接着在xuewei_event.wait(3)这里会等待3秒,然后返回False

我们看看完整运行结果:

屏幕快照 2021-11-28 下午11.15.22.png

读者可以把clear()函数调用注释掉查看运行结果。

Event是一个线程安全的类

再特点说一下wait函数。

上面的代码传入参数所以程序在3秒后继续切换回主线程了。

xuewei_event.wait(3)

如果是下面的函数调用(不带参数),则会让调用wait函数的线程一直等待。

直到xuewei_event 对象所持有的flag的值为True,线程继续运行wait函数后面的代码。

xuewei_event.wait()

总结

Event类的这种结构设计很简单,封装了一个对外不可直接操作的flag变量。

因为它线程安全,天然的适合做多线程应用开发。

读者可以先想想怎么使用event来实现**:多线程真正同时运行**。给个提示,不妨把Event的set函数看作鸣枪发信号,下一篇学委会揭晓。

对了,喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雷学委

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

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

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

打赏作者

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

抵扣说明:

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

余额充值