Как реализовать многопоточное ведение токенов в Python? - PullRequest
0 голосов
/ 10 ноября 2018

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