15行Python代码,帮你理解令牌桶算法

在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。

什么是令牌

从名字上看令牌桶,大概就是一个装有令牌的桶吧,那么什么是令牌呢?

紫薇格格拿的令箭,可以发号施令,令行禁止。在计算机的世界中,令牌也有令行禁止的意思,有令牌,则相当于得到了进行操作的授权,没有令牌,就什么都不能做。

用令牌实现限速器

我们用1块令牌来代表发送1字节数据的资格,假设我们源源不断的发放令牌给程序,程序就有资格源源不断的发送数据,当我们不发放令牌给程序,程序就相当于被限流,无法发送数据了。接下来我们说说限速器,所谓限速器,就是让程序在单位时间内,最多只能发送一定大小的数据。假设在1秒发放10块令牌,那么程序发送数据的速度就会被限制在10bytes/s。如果1秒内有大于10bytes的数据需要发送,就会因为没有令牌而被丢弃。

改进限速器——加个桶

我们实现的限速器,速度是恒定的,但是在实际的应用中,往往会有突发的传输需求(需要更快速的发送,但是不会持续太久,也不会引起网络拥塞),这种数据碰上我们的限速器,就因为拿不到令牌而无法发送。

对限速器进行一下改动,依然1秒产生10块令牌,但是我们把产生出来的令牌先放到一个桶里,当程序需要发送的时候,从桶里取令牌,不需要的时候,令牌就会在桶里沉淀下来,假设桶里沉淀了10块令牌,程序最多就可以在1秒内发送20bytes的数据,满足了突发数据传输的要求,并且由于桶里的令牌被用完,下一秒最多依然只能发10bytes的数据,不会因为持续发送大量数据,对网络造成压力。

15行Python代码实践令牌桶

令牌桶需要以一定的速度生成令牌放入桶中,当程序要发送数据时,再从桶中取出令牌。这里似乎有点问题,如果我们使用一个死循环,来不停地发放令牌,程序就被阻塞住了,有没有更好的办法?

我们可以在取令牌的时候,用现在的时间减去上次取令牌的时间,乘以令牌的发放速度,计算出桶里可以取的令牌数量(当然不能超过桶的大小),从而避免循环发放的逻辑。

接下来看代码:

import timeclass TokenBucket(object):# rate是令牌发放速度,capacity是桶的大小def __init__(self, rate, capacity):self._rate = rateself._capacity = capacityself._current_amount = 0self._last_consume_time = int(time.time())# token_amount是发送数据需要的令牌数def consume(self, token_amount):increment = (int(time.time()) - self._last_consume_time) * self._rate  # 计算从上次发送到这次发送,新发放的令牌数量self._current_amount = min(increment + self._current_amount, self._capacity)  # 令牌数量不能超过桶的容量if token_amount > self._current_amount:  # 如果没有足够的令牌,则不能发送数据return Falseself._last_consume_time = int(time.time())self._current_amount -= token_amountreturn True
复制代码

扫码关注Python私房菜

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

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

相关文章

在Java中,如何使一个字符串的首字母变为大写

问题:在Java中,如何使一个字符串的首字母变为大写 我使用Java去获取用户的字符串输入。我尝试使他们输入的第一个字符大写 我尝试这样: String name;BufferedReader br new InputStreamReader(System.in);String s1 name.charAt(0).toUppercase());…

在加利福尼亚州投资于新餐馆:一种数据驱动的方法

“It is difficult to make predictions, especially about the future.”“很难做出预测,尤其是对未来的预测。” ~Niels Bohr〜尼尔斯波尔 Everything is better interpreted through data. And data-driven decision making is crucial for success in any ind…

javascript脚本_使用脚本src属性将JavaScript链接到HTML

javascript脚本The ‘src’ attribute in a tag is the path to an external file or resource that you want to link to your HTML document.标记中的src属性是您要链接到HTML文档的外部文件或资源的路径。 For example, if you had your own custom JavaScript file named …

阿里云ESC上的Ubuntu图形界面的安装

系统装的是Ubuntu Server 16.04 64位版的图形界面,这里是转载的一个大神的帖子 http://blog.csdn.net/dk_0228/article/details/54571867, 当然自己也再记录一下,加深点印象 1.更新apt-get 保证最新 apt-get update 2.用putty或者Xshell连接远…

leetcode 1269. 停在原地的方案数(dp)

示例 1: 输入:steps 3, arrLen 2 输出:4 解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。 向右,向左,不动 不动,向右,向左 向右,不动,向…

JavaScript Onclick事件解释

The onclick event in JavaScript lets you as a programmer execute a function when an element is clicked.JavaScript中的onclick事件可让您作为程序员在单击元素时执行功能。 按钮Onclick示例 (Button Onclick Example) <button onclick"myFunction()">C…

近似算法的近似率_选择最佳近似最近算法的数据科学家指南

近似算法的近似率by Braden Riggs and George Williams (gwilliamsgsitechnology.com)Braden Riggs和George Williams(gwilliamsgsitechnology.com) Whether you are new to the field of data science or a seasoned veteran, you have likely come into contact with the te…

VMware安装CentOS之二——最小化安装CentOS

1、上文已经创建了一个虚拟机&#xff0c;现在我们点击开启虚拟机。2、虚拟机进入到安装的界面&#xff0c;在这里我们选择第一行&#xff0c;安装或者升级系统。3、这里会提示要检查光盘&#xff0c;我们直接选择跳过。4、这里会提示我的硬件设备不被支持&#xff0c;点击OK&a…

什么是GraphQL? 普通神话被揭穿。

I love talking about GraphQL, especially with people who have been working with GraphQL or thinking of adopting GraphQL. One common question people have is why someone would want to move to GraphQL from REST. 我喜欢谈论GraphQL&#xff0c;特别是和那些一直在…

在Spring Boot里面,怎么获取定义在application.properties文件里的值

问题&#xff1a;在Spring Boot里面&#xff0c;怎么获取定义在application.properties文件里的值、 我想访问application.properties里面提供的值&#xff0c;像这样&#xff1a; logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR logging…

连接sqlexpress

sqlexpress在visualstudio安装时可选择安装。   数据源添加 localhost\sqlexpress window身份认证即可。转载于:https://www.cnblogs.com/zjxbetter/p/7767241.html

在Python中使用Seaborn和WordCloud可视化YouTube视频

I am an avid Youtube user and love watching videos on it in my free time. I decided to do some exploratory data analysis on the youtube videos streamed in the US. I found the dataset on the Kaggle on this link我是YouTube的狂热用户&#xff0c;喜欢在业余时间…

Win下更新pip出现OSError:[WinError17]与PerrmissionError:[WinError5]及解决

环境&#xff1a;Win7 64位&#xff0c;python3.6.0 我在准备用pip装东西的时候&#xff0c;在cmd里先更新了一下pip&#xff0c;大概是9.0.1更新到9.0. 尝试更新pip命令&#xff1a; pip install --upgrade pip 更新一半挂了 出现了 OSError:[WinError17] 与 PerrmissionError…

老生常谈:抽象工厂模式

在创建型模式中有一个模式是不得不学的,那就是抽象工厂模式(Abstract Factory),这是创建型模式中最为复杂,功能最强大的模式.它常与工厂方法组合来实现。平时我们在写一个组件的时候一般只针对一种语言,或者说是针对一个区域的人来实现。 例如:现有有一个新闻组件,在中国我们有…

ogc是一个非营利性组织_非营利组织的软件资源

ogc是一个非营利性组织Please note that freeCodeCamp is not partnered with, nor do we receive a referral fee from, any of the following providers. We simply want to help guide you toward a solution for your organization.请注意&#xff0c;freeCodeCamp不与以下…

数据结构入门最佳书籍_最佳数据科学书籍

数据结构入门最佳书籍Introduction介绍 I get asked a lot what resources I recommend for people who want to start their Data Science journey. This section enlists books I recommend you should read at least once in your life as a Data Scientist.我被很多人问到…

函数式编程概念

什么是函数式编程 简单地说&#xff0c;函数式编程通过使用函数&#xff0c;将值转换成抽象单元&#xff0c;接着用于构建软件系统。 面向对象VS函数式编程 面向对象编程 面向对象编程认为一切事物皆对象&#xff0c;将现实世界的事物抽象成对象&#xff0c;现实世界中的关系抽…

在Java里面怎么样在静态方法中调用getClass()?

问题&#xff1a;在Java里面怎么样在静态方法中调用getClass()&#xff1f; 我有一个类&#xff0c;它必须包含一些静态方法&#xff0c;在这些静态方法里面我需要像下面那样调用getClass() 方法 public static void startMusic() {URL songPath getClass().getClassLoader(…

变量名和变量地址

变量名和变量地址 研一时&#xff0c;很偶然的翻开谭浩强老先生的《C程序设计》&#xff08;是师姐的书&#xff0c;俺的老早就卖了&#xff0c;估计当时觉得这本书写得不够好&#xff09;&#xff0c;很偶然的看到关于变量名的一段话&#xff1a;“变量名实际上是一个符号地址…

多重插补 均值插补_Feature Engineering Part-1均值/中位数插补。

多重插补 均值插补Understanding the Mean /Median Imputation and Implementation using feature-engine….!了解使用特征引擎的均值/中位数插补和实现…。&#xff01; 均值或中位数插补&#xff1a; (Mean or Median Imputation:) The mean or median value should be calc…