当前位置: 首页 > article >正文

python多线程之Event机制笔记

Event 事件 笔记

1. 基本概念

threading.Event 是 Python 线程同步的基础组件,本质是一个布尔标志位,提供跨线程的事件通知机制。

2. 核心方法

方法作用描述
set()设置事件为 True,唤醒所有等待线程
clear()重置事件为 False
wait(timeout=None)阻塞直到事件被设置或超时(返回是否等到事件)
is_set()返回当前事件状态

3. 注意事项

  1. 避免死锁:确保至少有一个线程会调用 set(),否则 wait() 会永久阻塞
  2. 超时机制:建议使用 wait(timeout=5) 防止意外阻塞
python event.wait(timeout=5.0)
  1. 状态管理:set() 后状态保持,除非 clear()

如需要更复杂的线程协调时,建议结合 threading.Condition 使用。

4. 演示

下面使用一个短跑比赛简单案例来演示一下,如何使用

from threading import Thread,Event
from queue import Queue
class Runner(Thread):
    # 初始化对象
    def __init__(self, event, name,queue):
        super().__init__()
        self.event = event
        self.name = name
        self.queue = queue

    def run(self):
        # 获取当前线程的名称
        print(f"运动员:{self.name},准备好了", )
        # 等待事件
        self.event.wait()
        # 结束,将名次放入队列
        self.queue.put(self.name)
        print(f"运动员:{self.name} 到达终点")


if __name__ == '__main__':
    # 创建一个事件
    event = Event()
    # 运动员名单列表
    runnerName = ["张三","李四","王五","赵六","孙七"]
    # 创建一个队列,用于记录名次
    queue = Queue(5)
    # 记录线程列表
    threadList = []
    #判断状态,如果为True,则设置为False
    if event.isSet():
        event.clear()

    # 创建运动员线程
    [threadList.append(Runner(event,name,queue)) for name in runnerName]

    # 启动线程
    [t.start() for t in threadList]
    # 接受指令
    while True:
        # 接受裁判指令
        key = input("输入跑指令: ")
        if key == "跑":
            # 设置事件,唤醒所有等待的运动员线程
            event.set()
            break
        else:
            print("指令不对,请重新下发")

    # 判断队列是否满,也就是运动员是否全部到达终点
    while  not queue.full():
        pass

    # 公布名次
    number = 1
    # 因为队列是先进先出,所以从队首依次取值,就是运动名次
    while not queue.empty():
        print(f"运动员:{queue.get()},排名第{number}名")
        number += 1


输出:

运动员:张三,准备好了
运动员:李四,准备好了
运动员:王五,准备好了
运动员:赵六,准备好了
运动员:孙七,准备好了
输入跑指令: 跑
运动员:张三 到达终点
运动员:王五 到达终点
运动员:赵六 到达终点
运动员:李四 到达终点
运动员:孙七 到达终点
运动员:张三,排名第1名
运动员:王五,排名第2名
运动员:赵六,排名第3名
运动员:李四,排名第4名
运动员:孙七,排名第5名

http://www.kler.cn/a/568957.html

相关文章:

  • Qt 中 **QGraphicsView** 框架的总结
  • openssl下aes128算法gcm模式加解密运算实例
  • 基于java,SpringBoot和Vue流浪动物救助领养管理系统设计
  • Qt中应用程序框架的体系说明 及应用程序类QApplication类深度解析与应用分析
  • ZK Rollup
  • JMeter 不同协议测试最佳实践汇总
  • 深入讨论C语言的可能抽象:部分对设计模式的思考
  • Maven 与持续集成(CI)/ 持续部署(CD)(一)
  • 小红的字母游戏(A组)
  • Rust~Pin的new
  • 【git】【rebase】git修改提交信息的几种方法
  • 【AI Coding】Windsurf:【Prompt】全局规则与项目规则「可直接使用」
  • 如何在 ArcGIS Pro 中将SHP转为KML:详细步骤与操作指南
  • 基于互联网协议的诊断通信(DoIP)
  • 《HarmonyOS Next × ArkTS框架:从AI模型压缩到智能家居控制的端侧开发指南》
  • 对rust中的from和into的理解
  • Android 应用开发中,证书、签名和加固简述
  • 加入二极管的NE555 PWM 电路
  • Go在1.22版本修复for循环陷阱
  • RJ45网口 与 M12连接器对比(D-code,X-code)