信号量(Semaphore)

一、概述

 

  互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。

  信号量:就是在同一时间,可以只允许设定的数执行,所以设置了信号量,就有多把锁。

 二、信号量

 说明:这个好比有3个人上厕所,就只有3把锁,如果有人进去,就会告诉你已经有人了,已经被占领了,其他的线程只能等。我们用threading.BoundedSemaphore(线程数)来定义一个信号量,代码如下:

 

def run(n):
    semaphore.acquire()   #加信号量锁
    time.sleep(1)
    print("run the thread: %s\n" %n)
    semaphore.release()   #释放锁
 
if __name__ == '__main__':
 
    semaphore  = threading.BoundedSemaphore(5) #最多允许5个线程同时运行(Bounded:绑定,Semaphore:信号量)
    for i in range(20):
        t = threading.Thread(target=run,args=(i,))
        t.start()
 
while threading.active_count() != 1:
    pass #print threading.active_count()
else:
    print('----all threads done---')

 

 注意:上面程序的执行,给我们的感觉是:分了5组,这5个同时完成,又同时进5个进去。但是实际的效果是:这5个里面如果有3个完成,就会立刻再放3个进去。不会等5个都完成,每出来1个就放进去1个,出来几个放进去几个。

 三、使用场景

 

  1. 连接池,线程池,MySQL的有连接池,同一时间有个并发,能连多少个连接。
  2. 我们为了保证我的socket_server,因为python不会默认现在你启动多少个线程,但是你启动的线程越多,就会把系统拉的越慢,就会把程序拉的越慢。这里就可以搞一个我同一时间放100线程个进来,就是用semaphore
  3. 最后注意的是:python3.x 虽然不加锁也是正确的,但是最好还是把锁加上。

 

posted @ 2017-10-14 10:12  人生是一场修行  阅读(254)  评论(0编辑  收藏  举报