www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

帮你知道令牌桶算法,一五行Python代码带您轻松

2019-06-01 12:34 来源:未知

在互连网中传输数据时,为了幸免互联网拥挤堵塞,需限制流出互连网的流量,使流量以相比较均匀的进程向外发送,令牌桶算法就兑现了那么些作用, 可决定发送到互联网上多少的多寡,并同意突发数据的出殡和埋葬。

一五行Python代码带你轻易驾驭令牌桶算法,一五行python

在互连网中传输数据时,为了防止互连网拥挤堵塞,需限制流出网络的流量,使流量以相比较均匀的进程向外发送,令牌桶算法就贯彻了那么些作用, 可调整发送到互联网上多少的多寡,并同意突发数据的出殡和埋葬。

怎样是令牌

从名字上看令牌桶,大致正是一个兼有令牌的桶吧,那么如何是令牌呢?

官样花格格拿的令箭,能够命令,马上就办。在计算机的社会风气中,令牌也可以有闻风而动的情致,有令牌,则一定于获得了进行操作的授权,未有令牌,就怎么样都不可能做。

用令牌达成限制速度器

我们用一块令牌来表示发送1字节数据的资格,若是大家源源不断的发给令牌给程序,程序就有资格源源不断的发送数据,当大家不发给令牌给程序,程序就也正是被限流,不可能发送数据了。接下来我们说说限制速度器,所谓限制速度器,正是让程序在单位时间内,最多只好发送一定大小的多少。若是在1秒发放10块令牌,那么程序发送数据的快慢就能够被限定在十bytes/s。就算1秒内有高出10bytes的数目须求发送,就能够因为尚未令牌而被遗弃。

革新限制速度器——加个桶

计算机编程 1 

咱俩落实的限制速度器,速度是固定的,可是在实际的应用中,往往会有突发的传输需要(供给更敏捷的出殡和埋葬,然而不会随处太久,也不会引起互联网堵塞),这种多少碰上大家的限制速度器,就因为拿不到令牌而不可能发送。

对限速器实行一下变动,还是一秒发生10块令牌,不过大家把发生出来的令牌先放置三个桶里,当程序要求发送的时候,从桶里取令牌,不供给的时候,令牌就能在桶里沉淀下来,假使桶里沉淀了10块令牌,程序最多就可以在一秒内发送20bytes的多寡,满足了突发数据传输的渴求,并且鉴于桶里的令牌被用完,下壹秒最多照旧只好发十bytes的数据,不会因为不断发送大批量数额,对网络形成压力。

计算机编程 2 

计算机编程,一五行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代码带您轻巧通晓令牌桶算法,希望对大家享有扶助,假如大家有别的疑问请给自个儿留言,小编会及时过来大家的。在此也特别多谢我们对帮客之家网址的支撑!

在网络中传输数据时,为了幸免网络拥挤堵塞,需限制流出互联网的流量,使流量以相比均匀的...

在网络中传输数据时,为了防止互联网拥挤堵塞,需限制流出互连网的流量,使流量以相比均匀的速度向外发送,令牌桶算法就贯彻了那个作用,可决定发送到网络上数据的数据,并允许突发数据的出殡和埋葬。

怎样是令牌

何以是令牌

从名字上看令牌桶,大约正是3个享有令牌的桶吧,那么如何是令牌呢?

官样花格格拿的令箭,能够命令,大张旗鼓。在Computer的世界中,令牌也许有大马金刀的情趣,有令牌,则一定于获得了举办操作的授权,未有令牌,就怎么着都不能够做。

从名字上看令牌桶,大概就是三个有所令牌的桶吧,那么什么样是令牌呢?

用令牌达成限制速度器

咱俩用1块令牌来表示发送壹字节数据的身价,假使大家连绵不断的发给令牌给程序,程序就有资格人山人海 蜂拥而上的发送数据,当我们不发给令牌给程序,程序就一定于被限流,不可能发送数据了。接下来我们说说限速器,所谓限速器,正是让程序在单位时间内,最五只可以发送一定大小的数额。倘若在一秒发放十块令牌,那么程序发送数据的速度就能够被限定在10bytes/s。假若1秒内有超越十bytes的多寡要求发送,就能因为从没令牌而被抛弃。

百日红格格拿的令箭,能够命令,大刀阔斧。在管理器的世界中,令牌也是有闻风而动的情趣,有令牌,则也正是获得了拓展操作的授权,未有令牌,就怎么都不可能做。

校勘限制速度器——加个桶

计算机编程 3

大家兑现的限制速度器,速度是一定的,不过在其实的利用中,往往会有突发的传导须要(必要更便捷的出殡和埋葬,但是不会持续太久,也不会挑起互联网堵塞),这种数量碰上大家的限制速度器,就因为拿不到令牌而高不可攀发送。

对限制速度器举行一下改观,依然一秒产生十块令牌,可是大家把发生出来的令牌先放置3个桶里,当程序供给发送的时候,从桶里取令牌,无需的时候,令牌就能够在桶里沉淀下来,假使桶里沉淀了10块令牌,程序最多就可以在一秒内发送20bytes的数额,满足了突发数据传输的渴求,并且由于桶里的令牌被用完,下1秒最多依旧只可以发十bytes的数量,不会因为不断发送大批量数量,对互连网变成压力。

计算机编程 4

用令牌完成限制速度器

15行Python代码施行令牌桶

令牌桶必要以一定的进程生成令牌放入桶中,当程序要发送数据时,再从桶中收取令牌。这里仿佛不怎么难点,假使大家使用3个死循环,来不停地发给令牌,程序就被阻塞住了,有未有越来越好的办法?

咱俩得以在取令牌的时候,用未来的时间减去上次取令牌的时刻,乘以令牌的发放速度,总计出桶里能够取的令牌数量(当然无法超越桶的大小),从而制止循环境与发展放的逻辑。

接下去看代码:

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

我们用一块令牌来代表发送一字节数据的身份,借使大家车水马龙 一拥而上的发给令牌给程序,程序就有资格继续不停的发送数据,当大家不发给令牌给程序,程序就一定于被限流,不可能发送数据了。接下来大家说说限制速度器,所谓限制速度器,正是让程序在单位时间内,最五只好发送一定大小的多少。假使在1秒发放10块令牌,那么程序发送数据的速度就能够被限定在10bytes/s。假使一秒内有越过拾bytes的数码须求发送,就能够因为尚未令牌而被扬弃。

扫码关心Python私人商品房菜

计算机编程 5

改进限制速度器——加个桶

计算机编程 6 

我们兑现的限制速度器,速度是一定的,不过在实质上的选取中,往往会有突发的传导要求(必要更便捷的出殡,然而不会不断太久,也不会引起网络堵塞),这种数据碰上大家的限制速度器,就因为拿不到令牌而1筹莫展发送。

对限制速度器举行一下改动,依然一秒产生十块令牌,可是大家把产生出来的令牌先放手贰个桶里,当程序要求发送的时候,从桶里取令牌,无需的时候,令牌就能在桶里沉淀下来,倘若桶里沉淀了十块令牌,程序最多就足以在一秒内发送20bytes的多少,餍足了始料不如数据传输的要求,并且鉴于桶里的令牌被用完,下1秒最多照旧只可以发10bytes的数码,不会因为不断发送多量数据,对网络造成压力。

计算机编程 7 

1五行Python代码实践令牌桶

令牌桶需求以一定的速度生成令牌放入桶中,当程序要发送数据时,再从桶中收取令牌。这里就好像有一点难题,借使大家应用2个死循环,来不停地发给令牌,程序就被阻塞住了,有未有更好的主意?

大家得以在取令牌的时候,用明天的光阴减去上次取令牌的光阴,乘以令牌的发放速度,总括出桶里能够取的令牌数量(当然不能赶上桶的大大小小),从而制止循环境与发展放的逻辑。

接下去看代码:

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

总结

上述所述是作者给大家介绍的15行Python代码带您轻轻易松了解令牌桶算法,希望对大家享有援助,若是我们有其他疑问请给自身留言,我会及时还原大家的。在此也特别感激大家对台本之家网站的支撑!

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:帮你知道令牌桶算法,一五行Python代码带您轻松