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.pswp.cn/news/390942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390942.shtml
英文地址,請注明出處:http://en.pswp.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…