python之信号量【Semaphore】

# 互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如
# 一个厕所有3个坑,那么最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去


import threading
import time

def run(n):
    semaphore.acquire()
    time.sleep(1)
    print("run the thread: %s" %n)
    semaphore.release()


if __name__ == '__main__':
    num = 0
    semaphore = threading.BoundedSemaphore(3)
    #最多允许3个线程同时运行
    for i in range(20):
        t = threading.Thread(target=run,args=[i,])
        t.start()


while threading.active_count() != 1:
    print(threading.active_count())
    pass
else:
    print("----all threads done----------")
    print(num)

  

下面我们来详细的讲解下信号量的例子,先看下测试代码

import threading
import time


def run(n):
    semaphore.acquire()
    time.sleep(1)
    print("run the thread: %s" % n)
    semaphore.release()


if __name__ == '__main__':
    num = 0
    semaphore = threading.BoundedSemaphore(2)
    # 最多允许3个线程同时运行
    for i in range(6):
        # print(i)
        t = threading.Thread(target=run, args=[i, ])
        t.start()

    while threading.active_count() != 1:
        time.sleep(0.5)
        print(threading.active_count())
    else:
        print("----all threads done----------")

我们会打印出当前active的线程数,这里需要注意,这个线程数还包括我们的主进程,也就是我们这里通过主进程起了6个子线程,那么他的active的线程数为7

我们看下打印的结果

7
run the thread: 1
run the thread: 0
5
5
run the thread: 2
run the thread: 3
3
3
run the thread: 4
run the thread: 5
1
----all threads done----------

通过上面的结果,我们可以看到active的线程数开始为7个,因为我们一共有7个线程,只要线程被start了,该线程就是active状态的

然后线程数从7个变为5个,在变为3个,在变为1个,最后为0个,这样我们就可以清晰的看到,同时只有2个线程可以在运行

我们下面把信号量调整为3个

import threading
import time


def run(n):
    semaphore.acquire()
    time.sleep(1)
    print("run the thread: %s" % n)
    semaphore.release()


if __name__ == '__main__':
    num = 0
    semaphore = threading.BoundedSemaphore(3)
    # 最多允许3个线程同时运行
    for i in range(6):
        # print(i)
        t = threading.Thread(target=run, args=[i, ])
        t.start()

    while threading.active_count() != 1:
        time.sleep(0.5)
        print(threading.active_count())
    else:
        print("----all threads done----------")

结果如下

7
run the thread: 1
run the thread: 0
run the thread: 2
4
4
run the thread: 5
run the thread: 3
run the thread: 4
1
----all threads done----------

最后我们不设置信号量

测试代码如下

import threading
import time


def run(n):
    # semaphore.acquire()
    time.sleep(1)
    print("run the thread: %s" % n)
    # semaphore.release()


if __name__ == '__main__':
    num = 0
    semaphore = threading.BoundedSemaphore(3)
    # 最多允许3个线程同时运行
    for i in range(6):
        # print(i)
        t = threading.Thread(target=run, args=[i, ])
        t.start()

    while threading.active_count() != 1:
        time.sleep(0.5)
        print(threading.active_count())
    else:
        print("----all threads done----------")

结果如下

7
run the thread: 0
run the thread: 2
run the thread: 3
run the thread: 5
run the thread: 1
run the thread: 4
1
----all threads done----------

现在应该小伙伴们对python多线程的信号量应该掌握了把

原文地址:https://www.cnblogs.com/bainianminguo/p/7253922.html