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

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名

相关文章:

  • Hutool - JWT:轻松玩转 JSON Web Token
  • 基于springboot+vue实现的宠物救助及领养平台(源码+L文+ppt)43-21
  • C++ 标准库容器的常用成员函数
  • 【语法】C++中string类中的两个问题及解答
  • 计算机毕业设计SpringBoot+Vue.js音乐网站(源码+文档+PPT+讲解)
  • 【Leetcode 每日一题】132. 分割回文串 II
  • Linux篇——工具
  • 每天一个Flutter开发小项目 (9) : Flutter状态管理进阶 - Provider构建你的简易购物车应用
  • ViewPager2跟ViewPager的区别
  • 基于单片机的智能扫地机器人
  • 完美解锁便捷版!
  • Linux:文件系统
  • 【Linux网络#10】:Https协议原理
  • hatitat-sim的agent.py各部分组成
  • 深入理解推理语言模型(RLM)
  • 【Linux】进程替换(七)
  • 微信小程序点击按钮,将图片下载到本地
  • [Computer Vision]实验六:视差估计
  • 使用haproxy实现MySQL服务器负载均衡
  • js 之 lodash函数库 的下载与基础使用
  • “9+2”复式票,浦东购彩者拿下体彩大乐透1153万头奖
  • 新片|《碟中谍8:最终清算》定档5月30日
  • 韧性十足的中国外贸企业:“不倒翁”被摁下去,还会再弹起来
  • 俄代表团:16日上午将继续“等候乌代表团”
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • OpenAI与微软正谈判修改合作条款,以推进未来IPO