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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python系列——多线程之event事件
下一篇:python系列——多线程中的lock、Rlock的应用与区别,以及Python2与python3对于多线程处理的不同

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.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读取unicode_java怎么样将unicode解码读取?Java读取本地文件进 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 - 输入学生成绩,取它们的平均值,然后通过排名等级的学生 - SO中文参考 - www.soinside.com... 2019-04-21
java构造函数有什么用_java构造函数有什么用,怎么用 2019-04-21
mysql 匹配 隔开的_按空格分隔关键字并搜索MySQL数据库 2019-04-21
java factory用法_怎样使用Java实现Factory设计模式 2019-04-21
java窗口内容如何复制_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)... 2019-04-21
盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重 2019-04-21
java输出狗的各类信息_第九章Java输入输出操作 2019-04-21
java notify怎么用_java 如何使用notify() 2019-04-21
java加载指定文件为当前文本,java:如何使用bufferedreader读取特定的行 2019-04-21
java metrics 怎么样,Java metrics 2019-04-21
在vscode中php语言配置,Visual Studio Code C / C++ 语言环境配置 2019-04-21