参考资料😊
菜鸟教程
视频
认识信号量
信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。
也可以简单的理解为,信号量是多把锁,同时允许多个线程来更改数据,而 互斥锁 同时只允许一个 线程 更改数据。
信号量的语法
import threading
sem = threading.Semaphore(3)
sem.acquire()
sem.release()
事件event中有一个全局内置标志Flag,值为 True 或者False。使用wait()函数的线程会处于阻塞状态,此时Flag指为False,直到有其他线程调用set()函数让全局标志Flag置为True,其阻塞的线程立刻恢复运行,还可以用isSet()函数检查当前的Flag状态。
均在下面的作业题中有体现
事件
Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。
Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。
-
set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
-
clear(): 将标志设为False。
-
wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
-
isSet(): 获取内置标志状态,返回True或False。
作业题
自己的答案:
import threading
import time
def exam1():
while (semaphore.acquire()):
if event.is_set(): # 设置事件
print('考试中') # 事件设置时,打印 考试中
# event.wait(1)
else:
print('考试结束') # 如果事件结束打印事件已经结束
event.wait(1) # 延迟输出
semaphore.release() # 释放锁
def set_event():
# while True:
print('获取当前时间为:'+time.ctime(time.time())) # 获取当前时间
event.set() # 设置时间
time.sleep(3) # 三秒钟之后
print()
print('三秒后,释放锁,触发事件')
event.clear() # 清楚事件
if __name__=='__main__':
semaphore=threading.Semaphore(1) # 设置并发线程数
event=threading.Event() # 绑定事件
set_e=threading.Thread(target=set_event)
set_e.start() # 开启线程
exam1=threading.Thread(target=exam1)
exam1.start() # 开启线程