并发编程之信号量Semaphore

信号量Semaphore

Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1; 调用release() 时内置计数器+1; 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

代码示例:

import random
import time
from threading import Semaphore, current_thread,Thread

sm = Semaphore(3)


def task():
    # # 对信号量加锁,一个进程占用则锁池 -1
    # sm.acquire()
    # print(f'this is a main name {current_thread().name}')
    # time.sleep(random.randint(1, 3))
    # # 释放信号量锁
    # sm.release()

    with sm:
        print(f'this is a main name {current_thread().name}')
        time.sleep(random.randint(1, 3))


if __name__ == '__main__':
    for i in range(10):
        t = Thread(target=task)
        t.start()
        
# this is a main name Thread-1 (task)
# this is a main name Thread-2 (task)
# this is a main name Thread-3 (task)
# this is a main name Thread-4 (task)this is a main name Thread-5 (task)
# 
# this is a main name Thread-6 (task)
# this is a main name Thread-7 (task)
# this is a main name Thread-8 (task)
# this is a main name Thread-9 (task)
# this is a main name Thread-10 (task)

信号量与进程池是完全不同的概念,进程池Pool(4),最大只能产生4个进程,而且从头到尾都只是这四个进程,不会产生新的,而信号量是产生一堆线程/进程

posted @ 2024-01-21 21:58  Xiao0101  阅读(33)  评论(0)    收藏  举报