threading.Event() 会创建一个事件对象,主要用于线程间的同步通信,允许一个线程发出信号,而其他一个或多个线程等待这个信号。
可以把它想象成一个“交通信号灯”:
- 红灯(内部标志为
False,默认状态): 车辆(线程)必须停下等待。 - 绿灯(内部标志为
True): 车辆(线程)可以通行。
Event 内部维护一个布尔标志,初始为 False。
-
一个或多个线程可以等待该标志变为
True(阻塞等待)。 -
另一个线程可以将标志设为
True(唤醒所有等待的线程),或者重新设回False。
非常适合一次性信号通知场景,比如:线程 A 必须等待线程 B某项任务完成后再开始工作。
主要方法
| 方法 | 说明 |
|---|---|
e = threading.Event() | 创建一个事件对象,内部标志初始值为 False |
e.set() | 将内部标志设为 True,并唤醒所有正在 wait() 的线程 |
e.clear() | 将内部标志重置为 False |
e.wait(timeout=None) | 阻塞当前线程,直到内部标志变为 True。若设置 timeout(秒),超时后无论标志如何都会返回,返回值或者是True 或者是超时False(超时后若标志仍为 False, 则返回 False) |
e.is_set() | 返回内部标志的当前值(True/False) |
实际代码示例
import threading
import time
def worker(event, name):
print(f"[{name}] 正在等待老板的指令...")
# 线程在此阻塞,等待 event 变为 True
event.wait()
print(f"[{name}] 收到指令,开始干活!")
def main():
# 1. 创建 Event 对象 (默认 flag=False)
work_event = threading.Event()
# 2. 创建并启动子线程
t1 = threading.Thread(target=worker, args=(work_event, "工人A"))
t2 = threading.Thread(target=worker, args=(work_event, "工人B"))
t1.start()
t2.start()
# 3. 主线程做一些准备工作
print("[老板] 正在准备物料...")
time.sleep(2) # 模拟准备时间
print("[老板] 物料准备完毕,下达指令!")
# 4. 发送信号 (flag=True),唤醒所有等待的 worker
work_event.set()
t1.join()
t2.join()
if __name__ == "__main__":
main()
常见的应用场景
控制线程运行顺序: 线程 B 需要依赖线程 A 的一些运行结果,线程 B 先 wait(),线程 A 某些任务完成后 调用set()变绿灯。
2118

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



