Semaphore(信号量)

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

import threading, time, sys


def run(n):
    semaphore.acquire()
    time.sleep(1)
    sys.stdout.write(f"run the thread: {n}\n") #为解决print方法的线程不安全性(主要是输出换行的问题),此处使用sys.stdout.write方法替代
    semaphore.release()

if __name__ == '__main__':
    num = 0
    semaphore = threading.BoundedSemaphore(5)  # 最多允许5个线程同时运行
    for i in range(20):
        t = threading.Thread(target=run, args=(i,))
        t.start()
    while threading.active_count() != 1:  #等于1时,表示只剩主线程
        pass
    else:
        print('----all threads done---')
        print(num)

 

上一篇:channel实现并发控制


下一篇:并发编程(四)AbstractQueuedSynchronizer(AQS)-Semaphre源码分析跟踪