事件对象可以用于 线程间通信、等待事件(线程可以使用事件对象等待某个条件的发生。一个线程可以调用wait()方法在事件对象上阻塞,直到事件被另一个线程设置为通知状态。)
class threading.Event
is_set()
当且仅当内部标识为True时,返回True
set()
设置内部标识为True
clear()
设置内部标识为False
wait(timeout=None)
阻塞线程直到内部变量为 true 。如果调用时内部标识为 true,将立即返回。否则将阻塞线程,直到调用 set() 方法将标识设置为 true 或者发生可选的超时。
注意事项:
1、该对象创建后,内部标识默认是False
2、wait如果设置超时时间,当等待时间超过超时时间时,返回False(基于3.9),而不会一直阻塞
3、如果在wait等待期间内部标识为变为True,则立马返回
import datetime
import threading
# 这里创建了一个单线程,在多线程中使用也是一样的
ev = threading.Event() # 创建事件对象
def func():
print("this is func, start", datetime.datetime.now())
while not ev.is_set(): # 判断事件对象内部标识是否是True
ev.wait(timeout=3)
print("this is func, wait ev True", datetime.datetime.now())
T1 = threading.Thread(target=func)
T1.start()
time.sleep(4)
ev.set()
print("ev set True", datetime.datetime.now())
this is func, start 2024-12-16 22:39:57.137499
this is func, wait ev True 2024-12-16 22:40:00.147945
ev set True 2024-12-16 22:40:01.143061
#这里可以看到this is func打印与ev set True 同一时间打印,表示当内部标识为True时,wait直接返回
this is func, wait ev True 2024-12-16 22:40:01.143061
当时看到这个wait的作用,在想这不是与time.sleep()一模一样吗?其实这里就可以知道,在wait等待期间内部标识为变为True,则立马返回