温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么理解python信号量

发布时间:2021-11-02 15:45:34 来源:亿速云 阅读:194 作者:iii 栏目:编程语言

本篇内容介绍了“怎么理解python信号量”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

“怎么理解python信号量”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI