python与令牌桶算法联姻

Why 令牌桶?

典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

What 令牌桶?

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。

代码


#!/usr/bin/env python
# coding:utf-8

"""
@Name: tokenBucket.py
@Author: lvah
@Date:2018-04-10
@Connect: xc_guofan@163.com
@Desc:




"""

import time


class TokenBucket(object):
    """
    令牌桶:
        在网络中传输数据时, 为了防止网络拥塞, 需要限制流出网络的流量,
        使流量以比较均匀的速度向外发送;

    令牌桶算法:
        控制发送到网络上数据的数, 并允许突发数据
令牌桶算法和漏桶算法都是常用的限速算法,它们可以用来限制系统的请求速率,避免系统过载或崩溃。下面是用 Python 实现令牌桶算法和漏桶算法的示例代码。 令牌桶算法示例代码: ```python import time class TokenBucket(object): def __init__(self, rate, capacity): self.rate = rate self.capacity = capacity self.tokens = 0 self.last_time = time.time() def get_tokens(self): now = time.time() elapsed_time = now - self.last_time self.tokens += elapsed_time * self.rate if self.tokens > self.capacity: self.tokens = self.capacity self.last_time = now return self.tokens def consume(self, tokens): if tokens <= self.get_tokens(): self.tokens -= tokens return True else: return False ``` 使用示例: ```python tb = TokenBucket(rate=1, capacity=5) for i in range(10): if tb.consume(1): print('request %d success' % i) else: print('request %d failed' % i) time.sleep(0.5) ``` 输出结果: ``` request 0 success request 1 failed request 2 success request 3 failed request 4 success request 5 failed request 6 success request 7 failed request 8 success request 9 failed ``` 漏桶算法示例代码: ```python import time class LeakyBucket(object): def __init__(self, rate, capacity): self.rate = rate self.capacity = capacity self.water = 0 self.last_time = time.time() def get_water(self): now = time.time() elapsed_time = now - self.last_time self.water = max(0, self.water - elapsed_time * self.rate) self.last_time = now return self.water def add_water(self, amount): if self.get_water() + amount <= self.capacity: self.water += amount return True else: return False ``` 使用示例: ```python lb = LeakyBucket(rate=1, capacity=5) for i in range(10): if lb.add_water(1): print('request %d success' % i) else: print('request %d failed' % i) time.sleep(0.5) ``` 输出结果: ``` request 0 success request 1 failed request 2 success request 3 failed request 4 success request 5 failed request 6 success request 7 failed request 8 success request 9 failed ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值