信号量也能限并发
(每道题开头都有同一段:上面的池小工具。)
没有池时,用一个信号量(Semaphore(n))也能限「同时最多 n 个」:每个任务开工前 acquire、干完 release,同时拿到许可的最多 n 个。这里用一个受锁保护的峰值计数器量一下峰值有没有超过限额:
import threading
LIMIT = 3
sem = threading.Semaphore(LIMIT)
running = 0
peak = 0
lock = threading.Lock()
def task():
global running, peak
with sem:
with lock:
running += 1
peak = max(peak, running)
with lock:
running -= 1
ts = [threading.Thread(target=task) for _ in range(10)]
for t in ts:
t.start()
for t in ts:
t.join()
print(str(peak <= LIMIT) + "/" + str(LIMIT))
全部评论