如何在Python中实现多线程令牌桶?

时间:2018-11-10 01:33:23

标签: python multithreading token bucket

我想实现一个多线程令牌桶。生产者将为容器生产令牌,而消费者将尝试从容器中获取令牌。如果容器中的令牌数量等于或大于消费者要求的令牌数量,则它将返回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()

0 个答案:

没有答案