有界信号量多放会怎样
本节的东西:
Gate(n) 最多 n 个同时在里面:Semaphore(n);顺便用一把小锁维护 inside / peak(峰值)
run_gate(n, workers, hold) workers 条线程各进一次 Gate 待 hold 秒,交回峰值普通的和有界的各建一个 2 的信号量,都拿一次放两次,看谁报错、之后各自还能连拿几次:
import threading
import time
class Counter:
def __init__(self):
self.n = 0
def inc(self):
tmp = self.n
time.sleep(0.001)
self.n = tmp + 1
class SafeCounter(Counter):
def __init__(self):
super().__init__()
self.lock = threading.Lock()
def inc(self):
with self.lock:
tmp = self.n
time.sleep(0.001)
self.n = tmp + 1
def hammer(counter, workers=2, times=30):
def job():
for _ in range(times):
counter.inc()
ts = [threading.Thread(target=job) for _ in range(workers)]
for t in ts:
t.start()
for t in ts:
t.join()
return counter.n
def probe(lock):
"""这把锁现在能不能立刻拿到?能就拿了再放回去,交回 True;拿不到交回 False。"""
if lock.acquire(blocking=False):
lock.release()
return True
return False
class Guard:
"""手写的 with 替身:进就 acquire,出就 release——不管是正常出还是异常出。"""
def __init__(self, lock):
self.lock = lock
def __enter__(self):
self.lock.acquire()
return self
def __exit__(self, exc_type, exc, tb):
self.lock.release()
return False
res = []
for S in (threading.Semaphore(2), threading.BoundedSemaphore(2)):
S.acquire()
S.release()
try:
S.release()
err = "没报"
except ValueError:
err = "报了"
k = 0
while S.acquire(blocking=False):
k += 1
res.append(err + ":" + str(k))
print("/".join(res))
全部评论