c语言令牌桶原理,令牌桶算法的使用

c语言令牌桶原理,令牌桶算法的使用背景负责的项目中有一个爬虫调度项目 基础的模型就是利用平台提供的 Token 通过相关的数据 API 从平台获取数据 对于每个 Token 均存在一个短时间内调用的上限 一旦超出限制 将在一段时间内不能进行继续获取 之前对于这个限制的管理比较简单 当任务触发时 会直接发起数据获取请求 通过检查返回信息 判断是否超限 如果超限 设置一个等待时间之后进行重试 但发现这样没有最大化的利用到 Token

背景

负责的项目中有一个爬虫调度项目。基础的模型就是利用平台提供的 Token 通过相关的数据 API 从平台获取数据。

对于每个 Token 均存在一个短时间内调用的上限。一旦超出限制,将在一段时间内不能进行继续获取。

之前对于这个限制的管理比较简单,当任务触发时,会直接发起数据获取请求。通过检查返回信息,判断是否超限,如果超限,设置一个等待时间之后进行重试。但发现这样没有最大化的利用到 Token. 因为发起请求本身就是对 Token 的一种消耗。

最近跟组长进行讨论相关细节时,他提到可以利用 Nginx 的流量限制来进行改进。研究之后发现令牌桶算法很合适这个需求。

令牌桶算法

简介

令牌桶(token bucket)算法是 Nginx 进行流量限制的一种常用算法。常用于控制发送到网络上的数据的数量,并允许突发数据的发送。

基础流程图

当数据请求来临时,算法通过检查当前桶的令牌量,如果令牌量足以支持消耗,即会进行接下来的处理。

如果令牌不足,则会将请求抛弃(获取缓存,看相关需求)

65af63c4f9d1

token_bucket.png

使用

在当前的需求中,对每一个 Token 实例添加一个容量桶。存储当前的可调用次数。当有 worker 发起请求时,先检查当前的可调用余量。

如果余量足够,则返回可调用状态,并设置当前的处理时间。当请求完毕时,对桶进行主动更新。如果当前余量不足以进行请求,则可以返回需要等待的时间,或者执行切换 Token 实例等操作。

简单实现

import time

class TokenBucket:

def __init__(self, rate=0.1, capacity=100):

“””

此 为 单例

初始化时 应设置 当前的容量为 总容量

:param rate: 速率 秒为单位

:param capacity: 总容量

“””

self._rate = rate

self._capacity = capacity

self.current_amount = capacity

self._last_consumed_at = int(time.time())

def consume(self, need_amount=1):

“””

进行消费

:param need_amount:

:return:

“””

increments = (int(time.time()) – self._last_consumed_at) * self._rate

self.current_amount = min(

self.current_amount + increments, self._capacity

)

if need_amount > self.current_amount:

return False

self.current_amount = self.current_amount – need_amount

self._last_consumed_at = int(time.time())

return True

def update(self, amount):

“””

存在一个更新操作,用于 Token 余量状态主动返回

并重新计算 最后消费时间

:param amount: 主动发送的数量

:return:

“””

self.current_amount = min(amount, self._capacity)

self._last_consumed_at = int(time.time())

源码可访问 code

参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177065.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:23
下一篇 2026年3月26日 下午8:24


相关推荐

  • JS创建和存储 cookie的一些方法

    JS创建和存储 cookie的一些方法

    2021年10月31日
    52
  • 软件版本号规范与命名原则是什么_版本号格式

    软件版本号规范与命名原则是什么_版本号格式1.软件版本阶段说明*Alpha版:此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改。*Beta版:该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。*RC版:该版本已经相当成熟了,基本上不存在导致错误的B

    2025年10月17日
    3
  • pycharm2019激活码 贴吧破解方法

    pycharm2019激活码 贴吧破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    51
  • FastJson小技巧——@JSONField的史上最全最详细讲解——一看就会

    FastJson小技巧——@JSONField的史上最全最详细讲解——一看就会常见 使用 fastjson 进行需要对字段进行一些特殊处理 比如时间格式 前后端名字不一致 字段为 null 是否依然序列化等问题 那么 fastjson 的 JSONField 就能很好的解决这些问题 JSONField 注解的源码如下 Retention RetentionPol RUNTIME Target ElementType METHOD ElementType FIELD ElementType PARAMETER public interfaceJSO

    2026年3月17日
    2
  • SSL与SET协议

    SSL与SET协议SSL SecureSocket 为 Netscape 所研发 用以保障在 Internet 上数据传输之安全 利用数据加密 Encryption 技术 可确保数据在网络 上之传输过程中不会被截取及窃听 目前一般通用之规格为 40bit 之安全标准 美国则已推出 128bit 之更高安全 标准 但限制出境 只要 3 0 版本以上之 I E 或 Netscape 浏览器即可支持 SSL

    2025年8月25日
    6
  • StringBuilder 使用方法

    StringBuilder 使用方法String 字符串常量 StringBuffer 字符串变量 线程安全 StringBuilde 字符串变量 非线程安全 nbsp 简要的说 String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象 然后将指针指向新的 String 对象 所以经常

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号