信号量

信号量(英语: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相关推荐

  1. Python 线程信号量 semaphore - Python零基础入门教程

    目录 一.Python 线程信号量 semaphore 简介 二.Python 线程信号量 semaphore 原理 三.Python 线程信号量 semaphore 函数介绍 四.Python 线程 ...

  2. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  3. java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore

    先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...

  4. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  5. java 信号量Semaphore

    在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固 ...

  6. 经典线程同步 信号量Semaphore

    信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...

  7. .Net 下信号量(Semaphore)的一种实现

    动机 从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C+ ...

  8. java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...

    信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制.一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放 ...

  9. 信号量(Semaphore)、闭锁(Latch)、栅栏(Barrier)

    目录 1.信号量(Semaphore) 描述 场景 Semaphore 2.闭锁(Latch) 描述 场景 CountDownLatch 3.栅栏(Barrier) 描述 场景 CyclicBarri ...

最新文章

  1. uva437The Tower of Babylon
  2. cocoaPod集成9大环境以及报错项目问题
  3. 太多产品人死于汇报!
  4. 同等条件下,杂交水稻是否增产?
  5. 【转】C# 控件的自定义拖动、改变大小方法
  6. 数据中心交换机芯片学习总结
  7. 【养眼美女win7主题】主题世界
  8. 两台电脑之间使用ntp做时间同步的总结
  9. 两数互素有什么性质_两个数互质是什么意思 判断互质数的方法有哪些
  10. 【DP + 思维】A Question of Ingestion Gym - 101673G
  11. APP消息推送测试点
  12. 2022中科院分区表即将公布,多方官宣:或将弃用影响因子
  13. 矩阵变换器MATLAB仿真,其他仿真模型也可 图中为三相矩阵 变换器仿真模型及其输入输出电流波形
  14. Linux centOS 7下安装配置Tomcat
  15. APP测试基本流程及APP测试要点
  16. Linux学习之centos 7 ping百度无法ping通
  17. 如何区分安装的oracle数据库是客户端还是服务器端?
  18. 管家婆软件五大实用小技巧,不会用太可惜了
  19. 计算机组成原课后答案,计算机组成原理课后习题答案解析
  20. win10下删除多余UEFI启动项的方法

热门文章

  1. alwayson高可用组_了解AlwaysOn可用性组上的备份-第1部分
  2. UVA10652木板包装
  3. 01_ExtJS_HelloWorld
  4. SICP习题解答2.22
  5. numpy linspace
  6. C语言,产生一组数字,并将其写入txt文档中
  7. 在appdelegate中 设置跟视图控制器 但是没办法全屏
  8. java中使用nextLine(); 没有输入就自动跳过的问题?
  9. maven mirror repository
  10. PCL—低层次视觉—点云滤波(基于点云频率)