信号量也能限并发

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:上面的池小工具。)

没有池时,用一个信号量(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))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论