RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

SmoothBursty

主要思想

记录 1秒内的微秒数/permitsPerSencond = 时间间隔interval,每一个interval可获得一个令牌
根据允许使用多少秒内的令牌参数,计算出maxPermits
setRate时初始化下次interval时间,及storedPermits

acquire时,计算当前nowMicros,如果大于下次interval时间时间,则更新storedPermits和下次interval时间,计算storedPermits能否满足此次acquire,如果能,则需要等待的时间为0,如果不能,则计算还需要多少微秒等待,并在非同步块外执行sleep操作

如果其他线程已经刷新了nextFreeTicketMicros,会如下情况acquire是无timeout的

Thread 1: acquire 11 -> storedPermits不能满足要求 -> waitTime = (acquire - stored) * stableIntervalMicros -> nextFreeTicketMicros += waitMicros ----->  out lock sleep
Thread 2: acquire 2 -> nowMicros < nextFreeTicketMicros , stored = 0,被线程1消耗完了 -> freshPermits = requiredPermits - storedPermitsToSpend 即 = requiredPermits -> waitTime = freshPermits * stableIntervalMicros
-> nextFreeTicketMicros += waitTime,此时的nextFreeTicketMicros包含了Thread1需要等待的时间 -------> out lock sleep a longer time

tryAquire(num,timeout)逻辑

timeoutMicros = timeout.toMicros
lock()
nowMicros = ...
canAcquire = nextFreeTicketMicros <= nowMicros + timeoutMicros
if(!canAcquire){return false;
}
else{microsToWait = ...
} 
unlock()
sleep(microsToWait)
return true;

SmoothWarmingUp

主要思想和SmoothBursty相似,由于带预热过程,刚开始由于availablePermitsAboveThreshold>0.0,速率会较慢,如果持续获取令牌,则会使availablePermitsAboveThreshold=0,速率变快

  • 从0->thresholdPermits,生成一个令牌的时间:stableIntervalMicros
  • 从thresholdPermits-> maxPermits ,生成一个令牌的时间:stableIntervalMicros + permits * slope;

    @Override
    final long reserveEarliestAvailable(int requiredPermits, long nowMicros) {
    resync(nowMicros);
    long returnValue = nextFreeTicketMicros;
    //当前需要且尽最大可能消费的
    double storedPermitsToSpend = min(requiredPermits, this.storedPermits);
    //新鲜permits个数,这些个数是一定会产生等待的,除了0
    double freshPermits = requiredPermits - storedPermitsToSpend;
    //计算需要wait的总时间
    long waitMicros =
    //非busty类型的storedPermitsToWaitTime直接返回0
    storedPermitsToWaitTime(this.storedPermits, storedPermitsToSpend)
    + (long) (freshPermits * stableIntervalMicros);
    //下次有票时间
    this.nextFreeTicketMicros = LongMath.saturatedAdd(nextFreeTicketMicros, waitMicros);
    this.storedPermits -= storedPermitsToSpend;
    return returnValue;
    }

     //已知permitsToTake <= storedPermits@Overridelong storedPermitsToWaitTime(double storedPermits, double permitsToTake) {//减去预热需要保留的permits,剩下的可消耗的数量double availablePermitsAboveThreshold = storedPermits - thresholdPermits;long micros = 0;// measuring the integral on the right part of the function (the climbing line)//如果有剩余可用的令牌if (availablePermitsAboveThreshold > 0.0) {//剩余可用的和需要获取的个数取小值double permitsAboveThresholdToTake = min(availablePermitsAboveThreshold, permitsToTake);// TODO(cpovirk): Figure out a good name for this variable.//用可消耗的数量 + (可消耗的数量 - 实际消耗的数量)permitsToTime//在预热阶段从thresholdPermits到maxPermits的耗时并非是stableIntervalMicros * n//会耗费更多的时间,其计算规则不同,所以才需要把permitsAboveThresholdToTake从permitsToTake减去//length 可能作为一个经验值,相当于补充permitsAboveThresholdToTake个令牌需要的平均时间值*2//剩余可用的-实际需要且最大能消耗的令牌,得到最终剩余的令牌个数,可能是0double length = permitsToTime(availablePermitsAboveThreshold)+ permitsToTime(availablePermitsAboveThreshold - permitsAboveThresholdToTake);//这里确实不好理解,从语义环境来说,它是从 thresholdPermits 到 maxPertmis 过程中//生成 permitsAboveThresholdToTake 个令牌需要耗费的时间//并且带coldFactor的构造函数不是public,SmoothWarmingUp也是private-package的micros = (long) (permitsAboveThresholdToTake * length / 2.0);//从permitsToTake中减去保留预热需留下个数后最终消耗的个数,这部分个数由于是提前存在的、富余的//因此不需要计算到wait时间permitsToTake -= permitsAboveThresholdToTake;}// measuring the integral on the left part of the function (the horizontal line)//如果没有剩余可用令牌,走的是stableIntervalMicros * nmicros += (stableIntervalMicros * permitsToTake);return micros;}   

length/2可以理解为下图
50145-20190627124610807-599597721.png

    //permits值越小,需要的时间就越少,值越大,需要的时间就越大private double permitsToTime(double permits) {//double coldIntervalMicros = stableIntervalMicros * coldFactor;// thresholdPermits = 0.5 * warmupPeriodMicros / stableIntervalMicros;//maxPermits =thresholdPermits + 2.0 * warmupPeriodMicros / (stableIntervalMicros + coldIntervalMicros);//slope带比率的时间,可以理解为增长因子//slope =  (coldIntervalMicros - stableIntervalMicros) / (maxPermits - thresholdPermits)//return表示成这样更易于理解 stableIntervalMicros + (coldIntervalMicros - stableIntervalMicros) * (permits/(maxPermits - thresholdPermits))return stableIntervalMicros + permits * slope;}

转载于:https://www.cnblogs.com/windliu/p/11088320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来已来:全球XR产业洞察

来源&#xff1a;德勤Deloitte编辑&#xff1a;蒲蒲近日&#xff0c;德勤中国科技、传媒和电信行业推出元宇宙系列报告《元宇宙系列白皮书—未来已来&#xff1a;全球XR产业洞察》&#xff0c;聚焦XR产业发展趋势。报告指出&#xff0c;多元融合是元宇宙的演变趋势。在元宇宙发…

谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘...

来源&#xff1a;神经科技编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7前不久&#xff0c;谷歌和哈佛大学联手发布人脑神经3D连接图&#xff0c;涵盖人脑一百万分之一的信息&#xff0c;但数据已经塞满了1400块1T硬盘&#xff01;现在&#xff0c;这个研究团队表示&#xff…

python replace()

转载于:https://www.cnblogs.com/JackFang-X/p/11090449.html

解决表单提交的数据丢失问题

解决表单提交的数据丢失问题&#xff1a; 一、问题描述&#xff1a; 当我们在给前台页面设置修改功能的时候&#xff0c;因为有些信息是不允许进行修改的&#xff0c;所以在修改表单中没有相应的修改输入框&#xff0c;但是在修改表单的数据提交的时候&#xff0c;那些不允许修…

科学家即将揭示人类大脑神经网络结构的奥秘

来源&#xff1a;今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光&#xff01;哈佛大学神经科学家和谷歌工程师&#xff0c;发布了第一张人类大脑部分的神经网络连接图&#xff0c;大约针头大小的人类大脑组织用重金属染色&#xff0c;切成 5,000&#xff0c;并在电子…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源&#xff1a;AI科技评论作者&#xff1a;Mr Bear编辑&#xff1a;青暮2021 年 10 月 13 日&#xff0c;来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

卷积神经网络(CNN)数学原理解析

来源&#xff1a;图灵人工智能作者&#xff1a;Piotr Skalski编辑&#xff1a;python数据科学原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks翻 译&#xff1a; 通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源&#xff1a;DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解&#xff0c;人脑包含大约 860 亿个神经元&#xff0c;可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像&#xff0c;甚至会产生数 PB 范围内的数据&#xff0c;这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前&#xff0c;我们需要了解数据类…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作&#xff1a;初始化&#xff0c;判断是否空表&#xff0c;清空表&#xff0c;获取表中的第i个元素&#xff0c;查找元素&#xff0c;插入元素&#xff0c;删除元素&#xff0c;获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源&#xff1a;ScienceAI作者&#xff1a;Immunai 联合创始人兼 CEO&#xff0c;Luis Voloch编译&#xff1a;绿萝数字生物学与 90 年代的互联网处于同一发展阶段&#xff08;早期、激动人心和变革性&#xff09;。当时&#xff0c;IP 地址的概念还很新&#xff0c;「精通技术…

实现调用API接口

API是一组封装好的函数&#xff0c;通过API&#xff0c;你可以为应用快速扩展功能&#xff0c;而无需理解它们是如何实现的&#xff0c;从而提升开发效率。通常&#xff0c;API服务商会提供API文档&#xff0c;那么如何根据文档来使用API呢&#xff1f; PS:该文章内容来自于阿里…

量子力学与机器学习相结合,预测高温下的化学反应

来源&#xff1a;ScienceAI编辑&#xff1a;凯霞在高温下从氧化物中提取金属不仅对于钢铁等金属的生产至关重要&#xff0c;而且对回收利用也必不可少。但当前的提取过程是碳密集型的&#xff0c;会排放大量温室气体。研究人员一直在探索开发「更绿色」的工艺方法。第一性原理理…

DeepMind提出强化学习新方法,可实现人机合作

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;盖策划&#xff1a;凌敏本文来自 BDTechTalks 网站的“AI 研究论文评论”专栏。该专栏提供人工智能最新发现的系列解读文章。尽管人工智能研究人员正力图建立能在围棋、星际争霸到 Dota 等复杂游戏中击败人类…

军事大脑的构建对未来战争的影响

前言&#xff1a;本文是我与军事科学院的赵蔚婷,王婉两位老师在2020年4月发表的一篇论文&#xff0c;首发在《中国科技论文在线》&#xff0c;是将互联网大脑模型与军事领域结合&#xff0c;形成军事大脑和军事超级智能的概念体系&#xff0c;重点提出军事神经元和军事云反射弧…

斯坦福抢开“元宇宙”第一课,上起来还真不便宜

过去半个世纪&#xff0c;斯坦福教给学生的技术&#xff0c;促成了硅谷的诞生&#xff1b;而为了将来的 Web3 时代&#xff0c;斯坦福也已经做好了准备。来源&#xff1a; 硅星人文&#xff1a;杜晨 编辑&#xff1a;VickyXiao今年10月底&#xff0c;硅谷顶级科技公司 Facebo…

加拿大工程院院士于非:互联—— 从质量、能源、信息到智能

来源&#xff1a;AI科技评论整理&#xff1a;莓酊编辑&#xff1a;青暮2021年12月9日&#xff0c;第六届全球人工智能与机器人大会&#xff08;GAIR 2021&#xff09;在深圳正式启幕。140余位产学领袖、30位Fellow聚首&#xff0c;从AI技术、产品、行业、人文、组织等维度切入&…

2021年诺贝尔经济学奖评述:解决重大社会问题的自然实验因果框架

来源&#xff1a;集智俱乐部作者&#xff1a;诺奖委员会译者&#xff1a;邓宇昊 编辑&#xff1a;邓一雪 导语许多重大社会问题都涉及到因果分析。比如&#xff0c;接受更长时间的教育是否会让你未来的收入增加&#xff1f;提高最低工资对一个地方的就业会产生怎样的影响&…

溯因推理:人工智能的盲点

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;Sambodhi策划&#xff1a;凌敏本文给当今人工智能界推崇深度学习的现象泼了冷水&#xff0c;指出了人工智能的盲点&#xff1a;溯因推理&#xff0c;并提醒人们不要忽视深度学习的种种问题&#xff0c;否则将…

终于,LoRaWAN成全球物联网标准!LoRa将拿下LPWAN领域50%市场?

来源&#xff1a;LoRa联盟官网等整理发布&#xff1a;物联网智库 不久之前&#xff0c;支持物联网低功耗广域网&#xff08;LPWAN&#xff09;LoRaWAN开放标准的LoRa联盟宣布&#xff0c;致力于“物联网和智慧城市及社区标准化”的国际电联电信标准化部门&#xff08;ITU-T&…