python 信号量 semaphore
信号量
信号量(英语:semaphore)又称为信号标,
是一个同步对象,用于保持在0至指定最大值之间的一个计数值。
当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;
当线程完成一次对semaphore对象的释放(release)时,计数值加一。
当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。
semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.
信号量的概念是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)发明,广泛的应用于不同的操作系统中。
在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,
未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。
如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);
如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。
以停车场的运作为例。
假设停车场只有三个车位,开始三个车位都是空的。
这时同时来了五辆车,看门人开闸允许其中三辆直接进入,
剩下的车则必须在入口等待,后续来的车也在入口处等待。
这时一辆车想离开停车场,告知看门人,打开闸门放他出去,
看门人看了看空车位数量,然后看门人才让外面的一辆车进去。
如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车好比一个线程,
看门人起的就是信号量的作用。
计数信号量具备两种操作动作,
V(signal())
P(wait())
(即部分参考书常称的“PV操作”)。
V操作会增加信号标S的数值,P操作会减少它。
运作方式:
初始化,给与它一个非负数的整数值。 如车位3个
运行P(wait()),信号标S的值将被减少。 减少一个车位
企图进入临界区段的进程,需要先运行P(wait())。 进入前,空车位数减1再放它进去
当信号标S减为负值时,进程会被挡住,不能继续; 没车位了,就拦住后面想进入的车
当信号标S不为负值时,进程可以获准进入临界区段。 有车位了,那就进去
运行V(signal()),信号标S的值会被增加。 告知,有车离开停车场了,显示空车位加1
结束离开临界区段的进程,将会运行V(signal())。 车离开前,会告诉看门人,放他出去
当信号标S不为负值时,先前被挡住的其他进程,将可获准进入临界区段。 有空车位,可以让其它车进去
下面介绍python里面的信号量semaphore
python统一了所有的命名
使用与线程锁同样的方法命名小好和释放资源
acquire方法
消耗资源加1 空车位减1
release方法
释放资源加1 空车位加1
创建BoundedSemaphore类实例
才可以使用信号量semaphore
通过该类的构造方法传入计数器的最大值空车位总数
from threading import BoundedSemaphore
Max =3
s =BoundedSemaphore(Max)
print(s._value)#输出计数器的值
s.acquire()#消耗1个资源
s.acquire()
s.acquire()
print(s._value)#输出计数器的值 这时输出的是0 也可以表示为False 当设定条件时,可以使用False来作为条件判断
# s.acquire()#已经没有资源了,再减就一直处于等待状态,除非设定了其他资源在执行完毕后并释放 这样才能继续消耗s.release()#释放1个资源
s.release()
s.release()
# s.release()#已超过资源设定的最大值了,再加就抛出异常 相当于停车场一共才3个车位,怎么会显示有4个车位呢?
print(s._value)#输出计数器的值
一个4S店有5个车位,进货,再卖车的示例:
from atexit import register
from random import randrange
from threading import BoundedSemaphore,Lock,Thread
from time import ctime,sleeplock =Lock() #创建线程锁
Max =5#总共车位数量
Parking = BoundedSemaphore(Max)#信号量 值为5#拉车进货 每次进车动作时执行时,不能卖车
def CarInto():lock.acquire()#获取线程锁print("车位:",Parking._value,end="")print("准备拉车入库....",end="")# 如果消耗资源成功,车辆进入,否则显示车已经足够try:Parking.acquire()#消耗1资源except ValueError:print("车位已经满了,车位:",Parking._value)else:print("车辆进入,车位:",Parking._value)lock.release()#释放线程锁#卖车出去 每次卖车动作在执行时,不能进车
def CarLeave():lock.acquire()# 获取线程锁print("车位:",Parking._value,end="")print("准备卖车出库....",end ="")# 当资源释放成功,车辆出去,否则显示没有车了try:Parking.release()#增加1资源except ValueError:print("没有车了,车位:",Parking._value)else:print("车辆卖出,车位:",Parking._value)lock.release() #释放线程锁#拉车进库 loops为一个数值 #产生[loops]次拉车入库动作
def PullIn(loops):for i in range(loops):CarInto()sleep(3)#卖车出去 loops为一个数值 #产生[loops]次卖车出库动作
def ThrowOut(loops):for i in range(loops):#产生2-5次卖车动作CarLeave()sleep(3)#每个卖车动作 休眠1-3秒def main():print("开始营业:",ctime())nloops = randrange(4,7)#产生一个4-6的随机数print("设定车位:%d"%Max)print('随机值为',nloops)#卖出车的最高值
# 一般情况下会线执行进货再卖车# 进货线程 实例# [拉车线程] [随机值]# 启动 Thread(target=PullIn,args=(nloops,)).start()#卖车线程 实例# [卖车线程] [再次定义一个随机值]# 启动 Thread(target=ThrowOut,args=(randrange(nloops,nloops+5),)).start()#添加到程序退出前 显示营业结束
@register
def exit():print("营业结束",ctime())if __name__=="__main__":main()
python 信号量 semaphore相关推荐
- Python 线程信号量 semaphore - Python零基础入门教程
目录 一.Python 线程信号量 semaphore 简介 二.Python 线程信号量 semaphore 原理 三.Python 线程信号量 semaphore 函数介绍 四.Python 线程 ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...
- 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...
信号量semaphore 允许多个线程同时访问 读写锁ReadWriteLock 在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch obj = new Count ...
- java 信号量Semaphore
在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固 ...
- 经典线程同步 信号量Semaphore
信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...
- .Net 下信号量(Semaphore)的一种实现
动机 从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C+ ...
- java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...
信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制.一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放 ...
- 信号量(Semaphore)、闭锁(Latch)、栅栏(Barrier)
目录 1.信号量(Semaphore) 描述 场景 Semaphore 2.闭锁(Latch) 描述 场景 CountDownLatch 3.栅栏(Barrier) 描述 场景 CyclicBarri ...
最新文章
- uva437The Tower of Babylon
- cocoaPod集成9大环境以及报错项目问题
- 太多产品人死于汇报!
- 同等条件下,杂交水稻是否增产?
- 【转】C# 控件的自定义拖动、改变大小方法
- 数据中心交换机芯片学习总结
- 【养眼美女win7主题】主题世界
- 两台电脑之间使用ntp做时间同步的总结
- 两数互素有什么性质_两个数互质是什么意思 判断互质数的方法有哪些
- 【DP + 思维】A Question of Ingestion Gym - 101673G
- APP消息推送测试点
- 2022中科院分区表即将公布,多方官宣:或将弃用影响因子
- 矩阵变换器MATLAB仿真,其他仿真模型也可 图中为三相矩阵 变换器仿真模型及其输入输出电流波形
- Linux centOS 7下安装配置Tomcat
- APP测试基本流程及APP测试要点
- Linux学习之centos 7 ping百度无法ping通
- 如何区分安装的oracle数据库是客户端还是服务器端?
- 管家婆软件五大实用小技巧,不会用太可惜了
- 计算机组成原课后答案,计算机组成原理课后习题答案解析
- win10下删除多余UEFI启动项的方法