欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

15行Python代碼帶你輕松理解令牌桶算法

 更新時間:2018年03月21日 10:34:57   作者:simpleapples  
這篇文章主要介紹了15行Python代碼帶你輕松理解令牌桶算法,需要的朋友可以參考下

在網(wǎng)絡中傳輸數(shù)據(jù)時,為了防止網(wǎng)絡擁塞,需限制流出網(wǎng)絡的流量,使流量以比較均勻的速度向外發(fā)送,令牌桶算法就實現(xiàn)了這個功能, 可控制發(fā)送到網(wǎng)絡上數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送。

什么是令牌

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

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

用令牌實現(xiàn)限速器

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

改進限速器——加個桶

 

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

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

 

15行Python代碼實踐令牌桶

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

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

接下來看代碼:

import time
class TokenBucket(object):
 # rate是令牌發(fā)放速度,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是發(fā)送數(shù)據(jù)需要的令牌數(shù)
 def consume(self, token_amount):
  increment = (int(time.time()) - self._last_consume_time) * self._rate # 計算從上次發(fā)送到這次發(fā)送,新發(fā)放的令牌數(shù)量
  self._current_amount = min(
   increment + self._current_amount, self._capacity) # 令牌數(shù)量不能超過桶的容量
  if token_amount > self._current_amount: # 如果沒有足夠的令牌,則不能發(fā)送數(shù)據(jù)
   return False
  self._last_consume_time = int(time.time())
  self._current_amount -= token_amount
  return True

總結

以上所述是小編給大家介紹的15行Python代碼帶你輕松理解令牌桶算法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • python實現(xiàn)內存監(jiān)控系統(tǒng)

    python實現(xiàn)內存監(jiān)控系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)內存監(jiān)控系統(tǒng),通過系統(tǒng)命令或操作系統(tǒng)文件獲取到內存信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python實現(xiàn)將長圖制作成一個視頻

    Python實現(xiàn)將長圖制作成一個視頻

    這篇文章主要為大家詳細介紹了Python如何實現(xiàn)將一個長圖制作成一個視頻,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • 利用Python pyecharts繪制餅圖

    利用Python pyecharts繪制餅圖

    這篇文章主要介紹了利用Python pyecharts繪制餅圖,餅圖主要用于表現(xiàn)不同類目的數(shù)據(jù)在總和中的占比。每個的弧度不是數(shù)據(jù)量的占比,下面我們一起進入文章看看具體的實現(xiàn)過程吧,需要的朋友也可以參考一下
    2021-12-12
  • python下如何讓web元素的生成更簡單的分析

    python下如何讓web元素的生成更簡單的分析

    做web不簡單,特別是當你需要使用一些web效果的時候, 比如顯示個圓角矩形,提示框之類的,也許你認為很簡單,好讓我們分析一下:
    2008-07-07
  • Python中列表list常用方法總結

    Python中列表list常用方法總結

    在?Python?中,列表(List)是一種有序的數(shù)據(jù)集合,可以存儲任意類型的數(shù)據(jù)。本文主要幫大家總結了一下列表list的常用方法,需要的可以參考一下
    2023-05-05
  • django restframework序列化字段校驗規(guī)則

    django restframework序列化字段校驗規(guī)則

    本文主要介紹了django restframework序列化字段校驗規(guī)則,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 在python中使用pymysql往mysql數(shù)據(jù)庫中插入(insert)數(shù)據(jù)實例

    在python中使用pymysql往mysql數(shù)據(jù)庫中插入(insert)數(shù)據(jù)實例

    今天小編就為大家分享一篇在python中使用pymysql往mysql數(shù)據(jù)庫中插入(insert)數(shù)據(jù)實例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 解決python中安裝serial及No module named ‘serial.tools‘等問題

    解決python中安裝serial及No module named ‘serial.too

    這篇文章主要介紹了解決python中安裝serial及No module named ‘serial.tools‘等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Django視圖類型總結

    Django視圖類型總結

    在本篇文章里小編給大家整理的是一篇關于Django視圖類型的總結內容,有興趣的朋友們可以學習下。
    2021-02-02
  • python中的import語句用法大全

    python中的import語句用法大全

    import語句用來導入其他python文件(稱為模塊module),使用該模塊里定義的類、方法或者變量,從而達到代碼復用的目的,文中給大家提到import 語句的兩種格式通過示例代碼介紹的很詳細,需要的朋友參考下吧
    2021-07-07

最新評論