我想实现一个多线程令牌桶。生产者将为容器生成令牌,而消费者将尝试从容器中获取令牌。如果容器中的令牌数量等于或大于消费者请求的令牌,则它将返回True并获取令牌;否则,请求将被拒绝并返回False。在
我试图使用信号量来实现它,但是发现使用自身容器信号量值。我想知道信号量的值的原因是我想确保消费者能够从桶中获得足够的令牌;否则,我将拒绝它。在
也许我对整件事有些误解。有人能指出实现多线程令牌桶的更好方法吗?在
from threading import BoundedSemaphore, Thread, Lock
class TokenBucket(object):
def __init__(self, max_capacity, rate):
self.container = BoundedSemaphore(max_capacity)
self.rate = rate
self.lock = Lock()
def consume(self, n):
self.lock.acquire()
if n <= self.container._Semaphore__value:
for _ in range(n):
self.container.acquire()
return True
else:
return False
self.lock.release()
def produce(self):
self.lock.acquire()
for i in range(self.fill_rate):
try:
self.container.release()
except ValueError:
print("Full, skipping.")
self.lock.release()
目前没有回答
相关问题 更多 >
编程相关推荐