python 多线程系列—信号量 (七)

本贴最后更新于 763 天前,其中的信息可能已经水流花落

一、信号量的作用

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()
2 回帖
请输入回帖内容 ...
  • xiu

    开始懂了 海励老师写的很细致!?

  • 其他回帖
  • AMuBai

    怒扣666 不愧是海励老师!!1