python 信号量_python学习之信号量

点击链接加入群138269539(全国招聘信息、免费公开课、视频应有尽有):https://jq.qq.com/?_wv=1027&k=5q0IklJ更多内容可以关注公众号:测试帮日记

如果想要控制同时访问资源的数量,我们可以怎么做呢?本篇文章将通过信号量的操作来达到这一需求。希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!

01:信号量

1)概述:信号量是用来控制线程并发数的。

2)原理:BoundedSemaphore和Semaphore管理一个内置的计数器。每当资源释放递增时(调用acquire)计数器-1,资源消耗时递减(调用release)计数器+1。

3)调用格式:threading.BoundedSemaphore/Semaphore(value);值默认1

4)使用场景:停车位(固定的停车位,车位全部被占用则进不来;只有车子离开其余车才能进来)

5)BoundedSemaphore和Semaphore区别:前者将在调用release()时检查计数器的值是否超过了计数器的初始值,如果超过将抛出一个异常。

6)注意事项:计数器不能小于0,当计数器为0时:acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。

02:案例操作

停车场只有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()

03:BoundedSemaphore和Semaphore区别案例操作

BoundedSemaphore调用时如果计数器的值超过了初始值会抛出异常;但是Semaphore不会

import threading,time,random

semaphore=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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值