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名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值