• 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
  • 相关阅读:
    SQL server management 查询所有触发器
    SQL SERVER 获取近七天每天的日期
    ASP.NET中maxRequestLength和maxAllowedContentLength的区别;上传大文件设置IIS7文件上传的最大大小
    where in 删除
    Sql Server 创建时间截取到年月日
    保留小数点后2位
    c# List数据分页
    图标快捷方式小箭头去掉的方法
    C# List转String的办法
    WinForm中实现通用的弹窗提示框
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/7202818.html
Copyright © 2020-2023  润新知