一、信号量的作用
1、信号量也是一种锁,主要用在保护有限的资源,常在多线程中控制获取资源的线程数量
二、信号量原理
1、Semaphore是一个工厂函数,负责返回一个新的信号量对象。
2、Semaphore内部维护一个计数器,该计数器的值= 初始值+release-acquare的值。
3、每次调用acquare方法都会使内部计数器减一,一旦计数器为负的,则acquare方法会被阻塞,直到其他线程调用release方法,使信号量内部计数器值为正。 计数器初始值为1。
三、常用方法:
1、 sem = threading.Semaphore(n) 设置最多同时启动线程数量
2、 sem.acquire() 每启动一个线程,可用线程数量就会减1
3、 sem.release() 完成后,就释放,可用线程数加1
4、bar = threading.Barrier(n) 凑够多少个才执行
四、代码举例
写一个for循环不段创建线程,通过信号量保证每次执行有5个线程同时运行
import threading
import time
import traceback
class Demo(threading.Thread):
def __init__(self, sem):
super().__init__()
self.sem = sem
def run(self):
try:
#每启动一个线程,可用线程数量就会减1
self.sem.acquire()
print("{}线程启动.....".format(self.getName()))
time.sleep(2)
#完成后,就释放,可用线程数加1
self.sem.release()
print("{}线程释放成功".format(self.getName()))
except Exception as e:
print(e, traceback.print_exc())
if __name__ == '__main__':
sem = threading.Semaphore(5) # 同时启动多少个线程
while True:
th=Demo(sem=sem)
th.start()
五、代码举例
bar = threading.Barrier(n) 凑够多少个才执行
import threading
class Demo(threading.Thread):
def __init__(self, barrier):
super().__init__()
self.barrier = barrier
def run(self):
print("{}只启动三个线程.....".format(self.getName()))
self.barrier.wait()
print("凑够3个线程再执行self.barrier.wait()方法之后的代码,否则会一直阻塞;")
if __name__ == '__main__':
#设置信号量为3
barrier = threading.Barrier(3)
for i in range(5):
th = Demo(barrier=barrier)
th.start()
欢迎来到testingpai.com!
注册 关于