美文网首页
令牌桶(Python)

令牌桶(Python)

作者: lucien_b35c | 来源:发表于2020-10-29 21:19 被阅读0次

需求

编写的django项目需要调用外部接口,但是用户的服务比较脆弱,需要请求方限制qps。

  • 漏桶算法
  • 令牌桶算法

代码

令牌桶实现代码

from time import time, sleep
# 用于全局缓存和锁
from django.core.cache import cache

LOCK_PREFIX = __name__

class TokenBucket:
    """令牌桶
    用于控制请求速度
    - 令牌信息存在redis中,包含两个字段:
    tokens: 令牌数量
    last: 最后更新时间戳

    """

    def __init__(self, bucket_key, rate=10):
        self.bucket_key = bucket_key
        if rate <= 0:
            raise Exception('Rate must more than 0')
        self.rate = rate

        # cache和lock的key
        self.lock_key = f'{LOCK_PREFIX}_{self.bucket_key}_bucket_lock'
        self.bucket_cache_key = f'{LOCK_PREFIX}_{self.bucket_key}'

    def get_token(self, amount=1):

        bucket_lock = cache.lock(self.lock_key)
        try:
            bucket_lock.acquire()
            now = time()
            token = cache.get(self.bucket_cache_key, None)
            if token is None:
                token = {
                    'tokens': self.rate,
                    'last': now
                }

            elapsed = now - token.get('last', now)

            if int(elapsed * self.rate):
                temp = token.get('tokens') + int(elapsed * self.rate)
                token['tokens'] = temp if temp < self.rate else self.rate
                token['last'] = now

            if token.get('tokens', 0) >= amount:
                token['tokens'] -= amount
                amount = 0
            else:
                amount -= token.get('tokens', 0)
                token['tokens'] = 0
            cache.set(self.bucket_cache_key, token)

            return amount
        finally:
            bucket_lock.release()

        return -1

    def consume(self, amount=1):
        while amount:
            amount = self.get_token(amount)
            sleep(1)
        return

DEMO

# qps = 100
bucket = TokenBucket('test', rate=100)
bucket.consume(1)

参考:
https://www.cnblogs.com/xuwc/p/9123078.html

相关文章

  • 令牌桶(Python)

    需求 编写的django项目需要调用外部接口,但是用户的服务比较脆弱,需要请求方限制qps。 漏桶算法 令牌桶算法...

  • Nginx 限流配置(转)

    限流算法: 1. 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;...

  • Nginx限流配置(转载)

    1、限流算法 令牌桶算法 算法思想是:a、令牌以固定速率产生,并缓存到令牌桶中;b、令牌桶放满时,多余的令牌被丢弃...

  • nginx限流算法

    1 限流算法 1.令牌桶 算法思想:*令牌以固定速率产生,并缓存到令牌桶中;*令牌桶放满时,多余的令牌被丢弃;*请...

  • 流控的那些事儿

    令牌桶算法令牌桶控制基于令牌桶是否存在令牌可以发送流量,每一个令牌是一个字节。当请求过来会消耗桶内中的令牌。另一边...

  • 令牌桶算法

    1、桶中每秒放入r个令牌 2、桶中最多能放入b个令牌,当令牌到达时令牌桶已经满了,令牌将被丢弃或放入缓存中 3、当...

  • 漏桶算法与令牌桶算法的区别

    令牌桶算法是通过控制令牌生成的速度进行限流,漏桶算法是控制请求从桶中流出的速度进行限流。简单理解为:令牌桶控制进,...

  • 【5分钟背八股】令牌桶限流算法是什么?

    令牌桶算法,是增加一个大小固定的容器,也就是令牌桶,系统以恒定的速率向令牌桶中放入令牌,如果有客户端来请求,先需要...

  • 令牌桶

    对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合...

  • Redisson限流器(RateLimiter)

    尝试获取令牌lua脚本解析 令牌桶配置(每分钟产生一个令牌) 令牌桶占用情况 分值:当时的时间 元素:随机数+申请...

网友评论

      本文标题:令牌桶(Python)

      本文链接:https://www.haomeiwen.com/subject/lnmlvktx.html