15行Python代碼帶你輕鬆理解令牌桶演算法,15行python

來源:互聯網
上載者:User

15行Python代碼帶你輕鬆理解令牌桶演算法,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 = 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

總結

以上所述是小編給大家介紹的15行Python代碼帶你輕鬆理解令牌桶演算法,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.