python系列——多线程之Semaphore信号量及
发布日期:2021-09-30 09:33:38
浏览次数:5
分类:技术文章
本文共 2603 字,大约阅读时间需要 8 分钟。
参考博客:
(以图的方式解释了lock锁、rlock锁、semaphore信号量)
(以semaphore信号量实现了生产者消费者)
(解释了semaphore信号量中信号量的功能)
(以实际semaphore的代码展示了如何允许指定数量的线程同时运行)
(介绍了semaphore信号量和BoundedSemaphore有界信号量的区别)
初始印象:
简单点说,Semphore,是一种带计数的线程同步机制,当调用release时,增加计数,当acquire时,减少计数,当计数为0时,自动阻塞,等待release被调用。
什么时候被使用:
import timeimport 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 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017ok Tue Jul 18 20:05:58 2017
可以看到,程序会在很短的时间内生成20个线程来打印一句话,如果在主机执行IO密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。
这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。使用方法:指定数量的线程同时运行:
# -*- coding:utf-8 -*-import threadingimport 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 numnum=0def run(): global num sem.acquire() num+=1 if num>0: sem.release() print(sem.release())for i in range(20): threading.Thread(target=run,args=()).start()print(num)
转载地址:https://blog.csdn.net/h_jlwg6688/article/details/108374611 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月10日 01时23分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java jmx 配置_为什么在配置JMX时Java打开3个端口?
2019-04-21
java thread回调_使用Runnable在Java中实现回调
2019-04-21
java 内存区_Java内存模型和Java内存区域的区别和联系?
2019-04-21
java定时任务监控_Spring定时任务使用及如何使用邮件监控服务器
2019-04-21
java crc32 使用_Java CRC32的用法
2019-04-21
java.io.file()_Java File getUsableSpace()方法
2019-04-21
java httpclient 工具_spring整合httpClient工具类
2019-04-21
java监控其他服务器运行状态_windows服务器监控多个tomcat运行状态
2019-04-21
java构造函数有什么用_java构造函数有什么用,怎么用
2019-04-21
mysql 匹配 隔开的_按空格分隔关键字并搜索MySQL数据库
2019-04-21
java factory用法_怎样使用Java实现Factory设计模式
2019-04-21
盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重
2019-04-21
java输出狗的各类信息_第九章Java输入输出操作
2019-04-21
java notify怎么用_java 如何使用notify()
2019-04-21
java metrics 怎么样,Java metrics
2019-04-21