参考博客:

https://segmentfault.com/a/1190000008123688  (以图的方式解释了lock锁、rlock锁、semaphore信号量)

http://blog.sina.com.cn/s/blog_82fefc100102xg97.html  (以semaphore信号量实现了生产者消费者)

https://blog.csdn.net/qq_33371343/article/details/79201161  (解释了semaphore信号量中信号量的功能)

https://www.jianshu.com/p/e52154188acc  (以实际semaphore的代码展示了如何允许指定数量的线程同时运行)

http://www.manongjc.com/detail/15-tdstifzseqcxlaw.html  (介绍了semaphore信号量和BoundedSemaphore有界信号量的区别)

初始印象:

简单点说,Semphore,是一种带计数的线程同步机制,当调用release时,增加计数,当acquire时,减少计数,当计数为0时,自动阻塞,等待release被调用。

什么时候被使用:

import time
import threadingdef foo():time.sleep(2) #程序休息2秒print("ok",time.ctime())for i in range(20):t1=threading.Thread(target=foo,args=())  #实例化一个线程t1.start()  #启动线程输出:
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017
ok Tue Jul 18 20:05:58 2017

可以看到,程序会在很短的时间内生成20个线程来打印一句话,如果在主机执行IO密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。
这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。

使用方法:指定数量的线程同时运行:

# -*- coding:utf-8 -*-
import threading
import timesem = threading.Semaphore(3)class DemoThread(threading.Thread):def run(self):print('{0} is waiting semaphore.'.format(self.name))sem.acquire()print('{0} acquired semaphore({1}).'.format(self.name, time.ctime()))time.sleep(5)print('{0} release semaphore.'.format(self.name))sem.release()if __name__ == '__main__':threads = []for i in range(4):threads.append(DemoThread(name='Thread-' + str(i)))for t in threads:t.start()for t in threads:t.join()

结果:

Thread-0 is waiting semaphore.
Thread-0 acquired semaphore(Thu Oct 25 20:33:18 2018).
Thread-1 is waiting semaphore.
Thread-1 acquired semaphore(Thu Oct 25 20:33:18 2018).
Thread-2 is waiting semaphore.
Thread-2 acquired semaphore(Thu Oct 25 20:33:18 2018).
Thread-3 is waiting semaphore.
Thread-0 release semaphore.
Thread-3 acquired semaphore(Thu Oct 25 20:33:23 2018).
Thread-1 release semaphore.
Thread-2 release semaphore.
Thread-3 release semaphore.

有界信号量boundageSamephore:

BoundedSemaphore在调用release()的时候,会校验一下当前信号量的值,是否会大于初始值(只定义了5个信号量,释放了5次后,还要调用release)的场景,会抛出异常,而 Semaphore在这种场景下,release()的结果只是None,没有返回信号量对象,并不会抛出异常。

具体例子:

import threading#sem=threading.BoundedSemaphore(5)
sem=threading.Semaphore(5)
global num
num=0
def run():global numsem.acquire()num+=1if num>0:sem.release()print(sem.release())for i in range(20):threading.Thread(target=run,args=()).start()
print(num)

python系列——多线程之Semaphore信号量及相关推荐

  1. python中的线程之semaphore信号量

    semaphore是一个内置的计数器 每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1 计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他 ...

  2. java多线程之Semaphore信号量详解

    信号量在操作系统中一般用来管理数量有限的资源.每类资源有一个对应的信号量.信号量的值表示资源的可用数量.在使用资源时,要先从该信号量上获取一个使用许可.成功获取许可之后,资源可用数量减1.在持有许可期 ...

  3. Java多线程之Semaphore用法

    Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...

  4. python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

    前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...

  5. python并发编程之semaphore(信号量)_python并发编程之多线程

    多线程 线程 1.什么是线程 进程是一个执行空间 , 线程就是其中真正工作的单位 , 每一个进程至少有一个线程(如果我们把操作系统比喻为一个工厂 , 进程就是车间 , 线程就是流水线) 进程包含了运行 ...

  6. python并发编程之semaphore(信号量)_Python 并发编程系列之多线程

    Python 并发编程系列之多线程 2 创建线程 2.1 函数的方式创建线程 2.2 类的方式创建线程 3 Thread 类的常用属性和方法 3.1 守护线程: Deamon 3.2 join()方法 ...

  7. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  8. python并发编程之semaphore(信号量)_python并发编程之Semaphore(信号量)

    threading模块里的Semaphore类实现了信号量对象,可用于控制获取资源的线程数量.所具有的acquire()和release()方法,可以用with语句的上下文管理器.当进入时,将调用ac ...

  9. Java并发编程之Semaphore信号量

    Semaphore: Semaphore基于AQS的共享模式实现,主要用于在总体许可(permits)一定的情况下,限制线程的并发访问,可用于实现:服务限流. 获取permits的过程: 如上图所示, ...

最新文章

  1. spl_autoload_register与autoload区别
  2. nn.CrossEntropyLoss()
  3. linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
  4. 心情随笔20180620
  5. mysql——JDBC
  6. redis查询所有key命令_三歪推荐:Redis常见的面试题
  7. Hibernate多表查询重新封装实体
  8. Ajax异步方式实现登录与參数的校验
  9. Spark源码系列(五)分布式缓存
  10. SublimeNFFT:Sublime Text 2从模板新建文件的插件
  11. 中gcd函数_函数和模块的使用
  12. [转]nonlocal和global
  13. 深入解读Linux内存管理系列(8)——SLAB初始化
  14. 190623每日一句
  15. 【Linux】04 软链接和硬链接
  16. 10款超炫HTML5游戏 附游戏源码
  17. Opencv2.4.9源码分析——Stitching(七)
  18. 毕业论文外文文献在哪里找?
  19. 程序员该怎么学习---弱水三千,只取一瓢
  20. C语言 —— char类型的使用(二)

热门文章

  1. 机器人开始“杀人”了
  2. 【MySQL】JDBC编程
  3. 浙江大学PAT考试基础知识整理
  4. Celestial Altium Library
  5. 网络安全——渗透综合实验
  6. 后摩尔时代来临,语音IC封装技术一触即发
  7. 利用C Free3.5 本身获得自身注册码
  8. PV操作经典例题——哲学家进餐问题
  9. 【ARM裸机s5pv210 】程序烧录
  10. 1258:【例9.2】数字金字塔