信号量可以看成是线程锁的加强版
信号量相当于一个计数器,和RTOS中任务向量表异曲同工,当资源消耗是递减,当资源释放是递增。也就是说acquire消耗资源减一,release释放资源加一。
可以认为信号量代表着资源是否可用。
使用信号量首先要创建BoundedSemaphore类的实例,并通过该类的方法传入信号量的最大值
实例演示了信号对象的创建,获取资源与释放资源:
# ——创建时间:2019.3.2——
# 多线程信号量
from threading import BoundedSemaphore
MAX = 3
# 创建信号量对象,并设置最大值
semaphore = BoundedSemaphore(MAX)
# 输出当前计数器的值
print(semaphore._value)
# 获得资源,计数器减一
semaphore.acquire()
# 输出当前计数器的值
print(semaphore._value)
# 获得资源,计数器减一
semaphore.acquire()
# 输出当前计数器的值
print(semaphore._value)
# 释放资源,计数器加一
semaphore.release()
# 输出当前计数器的值
print(semaphore._value)
# 释放资源,计数器加一
semaphore.release()
# 输出当前计数器的值
print(semaphore._value)
# 如果再次释放资源,则会抛出异常!
结果:
3
2
1
2
3
不能再获取资源时,acquire会返回False;不能再次释放资源时,会抛出异常!