Event 是 Python 中一种线程间通讯的机制, 通过 Event 可以轻松的协调多个线程并通知一个线程或多个线程某个事件的发生。
Event 基本概念
使用Event 做线程同步流程非常简单, Event只有设置和未设置两种状态, 当 Event 被设置时, 所有等待的 Event 的线程都会被唤醒(类似于 Condition 中的 notify_all), 当 Event 未被设置时, 等待 Event 的线程就会被阻塞, 一直等到被设置才会重新运行。
Event 方法及使用
Event 主要通过以下方法来实现线程的设置和等待
wait(): 如果 Event 状态为 False, 则执行 wait 后线程将被阻塞, 直到被唤醒。 如果 Event 状态已经为 True, 那么 wait 方法将立即返回, 不会重新将线程阻塞, 这一点很重要, 如果需要重新阻塞就需要clear事件状态(如下方代码中示例)
set(): 将 Event 的状态设置为 True, 当执行 set 方法的时候, 如果有等待此事件的线程, 那么它们都将被唤醒
clear(): 将 Event 的状态设置为 False
以下代码使用生产者和消费者模型来模拟使用 Event 来处理事件同步的问题
from threading import Event, Thread, current_thread
from time import sleep
# 获取Event实例
event = Event()
# 全局计数
count = 0
# 生产者
def producer():
global count
while True:
# 当计数大于100时, 当前线程等待
# 如果线程为已设置状态, 则clear清空状态
if count > 100:
event.wait()
event.clear()
else:
count += 20
print(f"{current_thread().name}, producer=>{count}")
sleep(0.1)
if __name__ == '__main__':
# 同时启动3个线程
p1 = Thread(target=producer)
p2 = Thread(target=producer)
p3 = Thread(target=producer)
p1.start()
p2.start()
p3.start()
while True:
# 主线程消费计数
# 如果计数小于20 , 则通知生产线程开始生产
if count < 20:
event.set()
else:
count -= 5
print(f"consumer=>{count}")
sleep(0.1)
上述代码中, 同时启动了 3 个生产者线程,用于增加 count 计数, 当 count 计数大于 100 的时候,生产者线程停止增加 count 计数。主线程消费 count, 当 count 被消费到小于 20 的时候,执行 set()方法,唤醒生产者线程。
从上述运行结果中可以看出, 当子线程处于阻塞状态的时候,主线程通过事件通知子线程,并唤醒子线程重新运行。