python中的线程之semaphore控制每次信号量

semaphore是一个内置的计数器

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

计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他线程调用release()
来看下面的代码:

import time import threading  def 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密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。
这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。

代码如下:

import time import threading  s1=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 2017
ok Tue Jul 18 20:04:38 2017
ok Tue Jul 18 20:04:38 2017
ok Tue Jul 18 20:04:38 2017
ok Tue Jul 18 20:04:38 2017
ok Tue Jul 18 20:04:40 2017
ok Tue Jul 18 20:04:40 2017
ok Tue Jul 18 20:04:40 2017
ok Tue Jul 18 20:04:40 2017
ok Tue Jul 18 20:04:40 2017
ok Tue Jul 18 20:04:42 2017
ok Tue Jul 18 20:04:42 2017
ok Tue Jul 18 20:04:42 2017
ok Tue Jul 18 20:04:42 2017
ok Tue Jul 18 20:04:42 2017
ok Tue Jul 18 20:04:44 2017
ok Tue Jul 18 20:04:44 2017
ok Tue Jul 18 20:04:44 2017
ok Tue Jul 18 20:04:44 2017
ok Tue Jul 18 20:04:44 2017

腾讯云限时秒杀【点击购买】

搬瓦工,CN2高速线路,1GB带宽,电信联通优化KVM,延迟低,速度快,建站稳定,搬瓦工BandwagonHost VPS优惠码BWH26FXH3HIQ,支持<支付宝> 【点击购买】!

Vultr$3.5日本节点,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快【点击购买】!

阿里云香港、新加坡VPS/1核/1G/25G SSD/1T流量/30M带宽/年付¥288【点击购买】

python中的线程之semaphore控制每次信号量

`微信`扫码 加好友

链接到文章: https://gkxyz.com/pythonzhongdexianchengzhisemaphorekongzhimeicixinhaoliang.html

推荐站点

  • 芒果TV-天生青春

    芒果TV-大家都在看的在线视频网站-热门综艺最新电影电视剧在线观看

  • Web Hosting Services Crafted with Care – SiteGround

    Our web hosting is trusted by more than 2,800,000 domai […]

  • RAKsmart

    主机商介绍:RAKsmart是知名的美国服务器租用商,包括美国站群服务器、美国cn2服务器、香港服务器等热门产 […]

  • 观察者网

    观察者网,致力于荟萃中外思想者精华,鼓励青年学人探索,建中西文化交流平台,为崛起中的精英提供决策参考。

  • DigitalOcean – The developer cloud

    Helping millions of developers easily build, test, mana […]

  • 懂车帝 – 说真的还得懂车帝

    懂车帝是一个汽车资讯平台,懂车更懂你。懂车帝资讯平台会聪明地分析你的兴趣爱好,自动为你推荐喜欢的汽车内容,提供 […]

评论已关闭