若是想要控制同时访问资源的数量,咱们能够怎么作呢?本篇文章将经过信号量的操做来达到这一需求。但愿感兴趣的小伙伴能够坚持看下去同时欢迎提出宝贵的意见让咱们一块儿进步!并发
1)概述:信号量是用来控制线程并发数的。dom
2)原理:BoundedSemaphore和Semaphore管理一个内置的计数器。每当资源释放递增时(调用acquire)计数器-1,资源消耗时递减(调用release)计数器+1。ide
3)调用格式:threading.BoundedSemaphore/Semaphore(value);值默认1ui
4)使用场景:停车位(固定的停车位,车位所有被占用则进不来;只有车子离开其他车才能进来)spa
5)BoundedSemaphore和Semaphore区别:前者将在调用release()时检查计数器的值是否超过了计数器的初始值,若是超过将抛出一个异常。线程
6)注意事项:计数器不能小于0,当计数器为0时:acquire()将阻塞线程至同步锁定状态,直到其余线程调用release()。code
停车场只有3个停车位。来了5辆汽车须要停车这时候就使用Semaphore来控制访问量了
只能同时容许3辆车同时进入停车场,第4辆车只有等先进入的3辆车中有车出来才可进入
import threading,time,random
semaphore=threading.Semaphore(3)#同一时间只能有3个线程处于运行状态
def run (ii):
semaphore.acquire() # 得到信号量:信号量减一
print(ii,'号车能够进入')
time.sleep(random.randint(0,10)*1)
print(ii,'号停车位释放')
semaphore.release()# 释放信号量:信号量加一
for i in range(5):#建立5个线程
t=threading.Thread(target=run,args=(i,))
t.start()
BoundedSemaphore调用时若是计数器的值超过了初始值会抛出异常;可是Semaphore不会orm
import threading,time,randomsemaphore=threading.BoundedSemaphore(3)#同一时间只能有3个线程处于运行状态def run (ii): semaphore.acquire() # 得到信号量:信号量减一 print(ii,'号车能够进入') time.sleep(random.randint(0,10)*1) print(ii,'号停车位释放') #***************此处高能****************** semaphore.release()# 释放信号量:信号量加一 # 再次释放信号量:信号量加一,这时超过限定的信号量数目会报错ValueError: Semaphore released too many times semaphore.release() #***************高能结束******************for i in range(5):#建立5个线程 t=threading.Thread(target=run,args=(i,)) t.start()