python系列——多线程之Semaphore信号量及
参考博客:
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信号量及相关推荐
- python中的线程之semaphore信号量
semaphore是一个内置的计数器 每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1 计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他 ...
- java多线程之Semaphore信号量详解
信号量在操作系统中一般用来管理数量有限的资源.每类资源有一个对应的信号量.信号量的值表示资源的可用数量.在使用资源时,要先从该信号量上获取一个使用许可.成功获取许可之后,资源可用数量减1.在持有许可期 ...
- Java多线程之Semaphore用法
Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...
- python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...
前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...
- python并发编程之semaphore(信号量)_python并发编程之多线程
多线程 线程 1.什么是线程 进程是一个执行空间 , 线程就是其中真正工作的单位 , 每一个进程至少有一个线程(如果我们把操作系统比喻为一个工厂 , 进程就是车间 , 线程就是流水线) 进程包含了运行 ...
- python并发编程之semaphore(信号量)_Python 并发编程系列之多线程
Python 并发编程系列之多线程 2 创建线程 2.1 函数的方式创建线程 2.2 类的方式创建线程 3 Thread 类的常用属性和方法 3.1 守护线程: Deamon 3.2 join()方法 ...
- python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...
9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...
- python并发编程之semaphore(信号量)_python并发编程之Semaphore(信号量)
threading模块里的Semaphore类实现了信号量对象,可用于控制获取资源的线程数量.所具有的acquire()和release()方法,可以用with语句的上下文管理器.当进入时,将调用ac ...
- Java并发编程之Semaphore信号量
Semaphore: Semaphore基于AQS的共享模式实现,主要用于在总体许可(permits)一定的情况下,限制线程的并发访问,可用于实现:服务限流. 获取permits的过程: 如上图所示, ...
最新文章
- spl_autoload_register与autoload区别
- nn.CrossEntropyLoss()
- linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
- 心情随笔20180620
- mysql——JDBC
- redis查询所有key命令_三歪推荐:Redis常见的面试题
- Hibernate多表查询重新封装实体
- Ajax异步方式实现登录与參数的校验
- Spark源码系列(五)分布式缓存
- SublimeNFFT:Sublime Text 2从模板新建文件的插件
- 中gcd函数_函数和模块的使用
- [转]nonlocal和global
- 深入解读Linux内存管理系列(8)——SLAB初始化
- 190623每日一句
- 【Linux】04 软链接和硬链接
- 10款超炫HTML5游戏 附游戏源码
- Opencv2.4.9源码分析——Stitching(七)
- 毕业论文外文文献在哪里找?
- 程序员该怎么学习---弱水三千,只取一瓢
- C语言 —— char类型的使用(二)