前言
一、介绍
- set — 全局内置标志 Flag,将标志 Flag 设置为 True,通知在等待状态 ( wait ) 的线程恢复运行;
- isSet — 获取标志 Flag 当前状态,返回 True 或者 False ;
- wait — 一旦调用,线程将会处于阻塞状态,直到等待其他线程调用 set 函数恢复运行;
- clear — 将标志设置为False;
二、原理
事件 event 中有一个全局内置标志 Flag,值为 True 或者False。使用 wait 函数的线程会处于阻塞状态,此时 Flag 指为 False,直到有其他线程调用 set 函数让全局标志 Flag 置为 True ,其阻塞的线程立刻恢复运行,还可以用 isSet 函数检查当前的 Flag 状态.
三、应用
# 导入线程模块
import threading
# 创建event事件
eEvent = threading.Event()
def get_girl_friend(id):
print(员工{}都准备完毕,内置Flag状态:{}.....".format(id,eEvent.isSet()))
eEvent.wait()
print("员工%d抢到奖品....."%id)
if __name__ == "__main__":
thread_list = list()
for i in range(1,11):
# 创建并初始化线程
t = threading.Thread(target=get_girl_friend,args=(i,))
# 启动线程
t.start()
# 将线程句柄添加list列表中
thread_list.append(t)
# 所有线程准备完毕,将event内置Flag设置为True,恢复正在阻塞的线程
eEvent.set()
# 遍历列表,阻塞主线程
for t in thread_list:
# 阻塞主线程,等待所有子线程结束
t.join()
print("程序结束!")
四、总结
注意互斥锁 Lock 与事件 Event 区别,需求不同,使用方式也不同:
- 互斥锁 Lock 主要针对多个线程同时操作同一个数据,使用互斥锁可以保证数据正常修改或者访问;
- 事件 Event 主要用于唤醒正在阻塞等待状态的线程;