同进程的一样

Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

实例:(同时只有5个线程可以获得semaphore,即可以限制最大连接数为5):

 1 from threading import Thread,Semaphore
 2 import threading
 3 import time
 4 # def func():
 5 #     if sm.acquire():
 6 #         print (threading.currentThread().getName() + ' get semaphore')
 7 #         time.sleep(2)
 8 #         sm.release()
 9 def func():
10     sm.acquire()
11     print('%s get sm' %threading.current_thread().getName())
12     time.sleep(3)
13     sm.release()
14 if __name__ == '__main__':
15     sm=Semaphore(5)
16     for i in range(23):
17         t=Thread(target=func)
18         t.start()
19 
20 实例
与进程池是完全不同的概念,进程池Pool(4),最大只能产生4个进程,而且从头到尾都只是这四个进程,不会产生新的,而信号量是产生一堆线程/进程
posted on 2018-11-09 19:04  frank007  阅读(196)  评论(0编辑  收藏  举报