Я хотел бы реализовать многопоточное ведение токена. Производитель будет производить токены для контейнера, в то время как потребитель будет пытаться извлечь токены из контейнера. Если количество токенов в контейнере равно или больше, чем токены, которые запрашивает потребитель, то он вернет 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()