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

2024-09-27 21:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: selffalsetruelockreleaseratecontainerdef

热门问题