一、什么是Event(事件/阻塞事件)?
- Event是
threading模块中的一个同步原语,常被称为“阻塞事件”或“事件对象”。 - 本质:内部维护着一个旗标(flag),用于在线程间传递“是否可以继续执行”的信号。
- 作用:让一个或多个线程等待某个条件成立(旗标为True)后再继续执行,阻塞和解除阻塞精确可控。
二、Event的主要方法
| 方法 | 作用说明 |
|---|---|
| is_set() | 判断旗标当前值(True/False)。初始为False。 |
| set() | 将旗标设为True,唤醒所有等待的线程。 |
| clear() | 将旗标设为False。 |
| wait(timeout) | 如果旗标为False,阻塞当前线程,直到旗标变为True或超时。 |
三、Event的工作原理
- 旗标初始为False,表示“条件未满足”,调用
wait()的线程会被阻塞。 - 某个线程调用
set(),将旗标设为True,所有等待的线程被唤醒,继续执行。 - 调用
clear(),将旗标重置为False,后续调用wait()的线程会再次被阻塞。 - **
is_set()**可以随时检查旗标状态。
四、代码示例
1. 基本用法
import threading
import time
event = threading.Event()
def worker():
print("子线程等待事件触发")
event.wait() # 阻塞,直到event.set()被调用
print("子线程收到事件,继续执行")
t = threading.Thread(target=worker)
t.start()
time.sleep(2)
print("主线程设置事件")
event.set() # 唤醒所有等待的线程
t.join()
输出示例:
子线程等待事件触发
主线程设置事件
子线程收到事件,继续执行
2. 常用场景
- 线程间通信:如主线程通知子线程“可以开始工作了”。
- 多线程同步:如多个线程等待某个条件成立后一起执行。
五、方法详解
1. is_set()
- 检查旗标当前状态。
- 返回
True表示事件已被触发,False表示未触发。
2. set()
- 将旗标设为
True,唤醒所有等待的线程。
3. clear()
- 将旗标重置为
False,后续调用wait()的线程会被阻塞。
4. wait(timeout=None)
- 如果旗标为
False,阻塞当前线程,直到旗标变为True或超时。 - 如果旗标为
True,立即返回,不阻塞。
六、Event与其他同步原语的区别
- Lock/Semaphore:用于互斥/限流,控制资源访问数量。
- Condition:用于复杂线程协作,支持wait/notify。
- Event:用于线程间“信号通知”,一对多唤醒,适合“等条件成立再执行”的场景。
七、总结
- Event通过内部旗标,实现线程间的“阻塞-唤醒”机制,适合需要“等条件成立再执行”的多线程场景。
- 主要方法:
is_set()、set()、clear()、wait()。 - 使用简单,适合线程间的信号通知和同步。
Python Event:线程同步原语详解
2525

被折叠的 条评论
为什么被折叠?



