我想实现一个多线程令牌桶。生产者将为容器生产令牌,而消费者将尝试从容器中获取令牌。如果容器中的令牌数量等于或大于消费者要求的令牌数量,则它将返回True并获取令牌;否则,它将返回True。否则,请求将被拒绝并返回False。
我正在尝试使用信号量来实现它,但是发现使用self.container._Semaphore__value访问容器中的令牌数量有点奇怪。我想知道信号量的值的原因是,我想确保使用者可以从存储桶中获取足够的令牌。否则,我会拒绝。
也许我对整个事情有些误解。谁能指出实现多线程令牌桶的更好方法?
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()