1 import threading, time
2
3 '''
4 信号量管理一个表示release()调用数减去的计数器acquire()调用的数量,加上一个初始值。
5 直到它可以返回而不需要做计数器负的,acquire()方法阻塞。如果未指定,值默认为1。 稀缺资源个设计,如:数据库连接池,线程池
6 '''
7 semaphore = threading.Semaphore(3)
8
9
10 class MyThread(threading.Thread):
11 def __init__(self, name):
12 super().__init__()
13 self.name = name
14
15 def run(self):
16 '''
17 当没有参数时调用:如果内部计数器大于输入为0,递减1,立即返回。
18 如果是零在进入时,阻塞,等待其他线程调用release()到让它大于0。
19 这是通过适当的联锁来完成的如果多个acquire()调用被阻塞,那么release()将只唤醒一个
20
21 :return:
22 '''
23 if semaphore.acquire():
24 print(self.name, 'had got resource')
25 time.sleep(1)
26 semaphore.release()
27 print(self.name, 'had released resource')
28
29
30 if __name__ == '__main__':
31 ths = [MyThread(str(i) + 'Sema') for i in range(6)]
32 for th in ths:
33 th.start()