线程同步之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 作者:闻骏