线程同步之Semaphore


01.Semaphore对象内部维护一个倒计数器,每一次acquire()都会减1,当信号量为0时即阻塞线程,其构建方式为:

Semaphore(value=1)
  • Semaphore类的参数包括:
    • value,信号量的数量。
  • Semaphore类的方法包括:
    • accquire(),获取信号量,计数器减一,获取成功返回True,其参数包括:
    • blocking=True,是否阻塞,默认阻塞。
    • timeout=None,超时时间,默认不超时。
    • release(),释放信号量,计数器加一。
  • Semaphore类的示例:
import threading
import logging
import time


FORMAT = "%(asctime)s %(threadName)s %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)

# 创建一个信号量,其计数器为3;当计数器为0时阻塞子线程
semaphore = threading.Semaphore(value=3)


def worker(s):
    time.sleep(1)
    # 获取信号量,计数器减1
    s.acquire()
    logging.info("I am working~~~~~~")


for i in range(20):
    time.sleep(0.1)
    threading.Thread(name="work-{}".format(i), target=worker, args=(semaphore,)).start()


while True:
    time.sleep(1)
    print(semaphore._value)
    # 如果计数为0,则释放一个信号量
    if semaphore._value == 0:
        print("There is no worker, now release one")
        semaphore.release()

    if threading.active_count() == 1:
        print("All jobs done, now finishing ...")
        break
文档更新时间: 2021-10-04 00:19   作者:闻骏