中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中如何實現令牌桶算法

發布時間:2021-08-12 12:53:53 來源:億速云 閱讀:235 作者:小新 欄目:開發技術

小編給大家分享一下Python中如何實現令牌桶算法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

什么是令牌

從名字上看令牌桶,大概就是一個裝有令牌的桶吧,那么什么是令牌呢?

紫薇格格拿的令箭,可以發號施令,令行禁止。在計算機的世界中,令牌也有令行禁止的意思,有令牌,則相當于得到了進行操作的授權,沒有令牌,就什么都不能做。

用令牌實現限速器

我們用1塊令牌來代表發送1字節數據的資格,假設我們源源不斷的發放令牌給程序,程序就有資格源源不斷的發送數據,當我們不發放令牌給程序,程序就相當于被限流,無法發送數據了。接下來我們說說限速器,所謂限速器,就是讓程序在單位時間內,最多只能發送一定大小的數據。假設在1秒發放10塊令牌,那么程序發送數據的速度就會被限制在10bytes/s。如果1秒內有大于10bytes的數據需要發送,就會因為沒有令牌而被丟棄。

改進限速器——加個桶

Python中如何實現令牌桶算法 

我們實現的限速器,速度是恒定的,但是在實際的應用中,往往會有突發的傳輸需求(需要更快速的發送,但是不會持續太久,也不會引起網絡擁塞),這種數據碰上我們的限速器,就因為拿不到令牌而無法發送。

對限速器進行一下改動,依然1秒產生10塊令牌,但是我們把產生出來的令牌先放到一個桶里,當程序需要發送的時候,從桶里取令牌,不需要的時候,令牌就會在桶里沉淀下來,假設桶里沉淀了10塊令牌,程序最多就可以在1秒內發送20bytes的數據,滿足了突發數據傳輸的要求,并且由于桶里的令牌被用完,下一秒最多依然只能發10bytes的數據,不會因為持續發送大量數據,對網絡造成壓力。

Python中如何實現令牌桶算法 

15行Python代碼實踐令牌桶

令牌桶需要以一定的速度生成令牌放入桶中,當程序要發送數據時,再從桶中取出令牌。這里似乎有點問題,如果我們使用一個死循環,來不停地發放令牌,程序就被阻塞住了,有沒有更好的辦法?

我們可以在取令牌的時候,用現在的時間減去上次取令牌的時間,乘以令牌的發放速度,計算出桶里可以取的令牌數量(當然不能超過桶的大小),從而避免循環發放的邏輯。

接下來看代碼:

import time
class TokenBucket(object):
 # rate是令牌發放速度,capacity是桶的大小
 def __init__(self, rate, capacity):
  self._rate = rate
  self._capacity = capacity
  self._current_amount = 0
  self._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 False
  self._last_consume_time = int(time.time())
  self._current_amount -= token_amount
  return True

以上是“Python中如何實現令牌桶算法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福海县| 英吉沙县| 海安县| 合作市| 成安县| 大丰市| 牟定县| 乳源| 赣榆县| 大厂| 额尔古纳市| 明光市| 陇川县| 嘉义市| 嘉祥县| 濮阳县| 武陟县| 乳山市| 固镇县| 莱西市| 盈江县| 昌图县| 抚顺市| 吉安市| 金寨县| 稷山县| 深州市| 西乌珠穆沁旗| 张家界市| 仲巴县| 栾川县| 建湖县| 蓬安县| 锡林浩特市| 天津市| 濮阳县| 宜宾市| 元氏县| 定陶县| 大邑县| 梁河县|