博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的线程之semaphore信号量
阅读量:6249 次
发布时间:2019-06-22

本文共 1789 字,大约阅读时间需要 5 分钟。

semaphore是一个内置的计数器

每当调用acquire()时,内置计数器-1每当调用release()时,内置计数器+1

计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他线程调用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密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。

这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。

代码如下:

import timeimport threadings1=threading.Semaphore(5)   #添加一个计数器def foo():    s1.acquire()    #计数器获得锁    time.sleep(2)   #程序休眠2秒    print("ok",time.ctime())    s1.release()    #计数器释放锁for i in range(20):    t1=threading.Thread(target=foo,args=()) #创建线程    t1.start()  #启动线程

执行结果:

ok Tue Jul 18 20:04:38 2017ok Tue Jul 18 20:04:38 2017ok Tue Jul 18 20:04:38 2017ok Tue Jul 18 20:04:38 2017ok Tue Jul 18 20:04:38 2017ok Tue Jul 18 20:04:40 2017ok Tue Jul 18 20:04:40 2017ok Tue Jul 18 20:04:40 2017ok Tue Jul 18 20:04:40 2017ok Tue Jul 18 20:04:40 2017ok Tue Jul 18 20:04:42 2017ok Tue Jul 18 20:04:42 2017ok Tue Jul 18 20:04:42 2017ok Tue Jul 18 20:04:42 2017ok Tue Jul 18 20:04:42 2017ok Tue Jul 18 20:04:44 2017ok Tue Jul 18 20:04:44 2017ok Tue Jul 18 20:04:44 2017ok Tue Jul 18 20:04:44 2017ok Tue Jul 18 20:04:44 2017

转载地址:http://mjgia.baihongyu.com/

你可能感兴趣的文章
day18 java 语言中的Map集合
查看>>
APP公共测试点
查看>>
remote tools
查看>>
技术流, 又充满争议的网站
查看>>
你可能还不知道的7个jQuery插件
查看>>
Grails 技巧 - Grails and Hibernate
查看>>
Github使用教程(一)--搭建Github环境
查看>>
Spring 事务使用详解
查看>>
九款可免费下载的app导航条
查看>>
ORACLE 限制特定IP访问数据库 访问白名单
查看>>
bash脚本中的显示效果
查看>>
oracle 11g和10gswap大小设置
查看>>
linux netstat 总结
查看>>
***之ip隧道应用策略路由实现走向分流
查看>>
ASP.NET MVC4+BootStrap 实战(三)
查看>>
MyBatis-3.4.2-源码分析11:XML解析之environmentsElement+Druid的解析准备工作:整合Druid...
查看>>
word 里输入法不见了怎么办
查看>>
CentOS 7.4 安装mysql5.6(yum)
查看>>
linux下网络流量监控工具
查看>>
6步在CentOS安装和配置MariaDB MySQL
查看>>