python多线程之Event机制笔记
Event 事件 笔记
1. 基本概念
threading.Event
是 Python 线程同步的基础组件,本质是一个布尔标志位,提供跨线程的事件通知机制。
2. 核心方法
方法 | 作用描述 |
---|---|
set() | 设置事件为 True,唤醒所有等待线程 |
clear() | 重置事件为 False |
wait(timeout=None) | 阻塞直到事件被设置或超时(返回是否等到事件) |
is_set() | 返回当前事件状态 |
3. 注意事项
- 避免死锁:确保至少有一个线程会调用 set(),否则 wait() 会永久阻塞
- 超时机制:建议使用 wait(timeout=5) 防止意外阻塞
python event.wait(timeout=5.0)
- 状态管理: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名