真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中如何實現(xiàn)令牌桶算法-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)專注于安陽縣網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供安陽縣營銷型網(wǎng)站建設,安陽縣網(wǎng)站制作、安陽縣網(wǎng)頁設計、安陽縣網(wǎng)站官網(wǎng)定制、小程序設計服務,打造安陽縣網(wǎng)絡公司原創(chuàng)品牌,更為您提供安陽縣網(wǎng)站排名全網(wǎng)營銷落地服務。

什么是令牌

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

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

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

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

改進限速器——加個桶

Python中如何實現(xiàn)令牌桶算法 

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

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

Python中如何實現(xiàn)令牌桶算法 

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

以上是“Python中如何實現(xiàn)令牌桶算法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站標題:Python中如何實現(xiàn)令牌桶算法-創(chuàng)新互聯(lián)
文章分享:http://weahome.cn/article/dsoged.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部