15行Python代码实现令牌桶算法:原理与限速器优化

一颗松果
一颗松果
发布时间:2026-10-13| 2人浏览过
原创

本文通过15行Python代码深入解析令牌桶算法,解决网络拥塞问题。文章从令牌概念入手,阐述基础限速器原理,并引入“桶”的概念以支持突发数据传输。通过计算时间差动态生成令牌,避免死循环阻塞,实现高效且灵活的流量控制机制。

在网络数据传输场景中,为避免网络拥塞,必须对流出流量进行限制,确保数据以相对均匀的速度发送。令牌桶算法正是实现这一功能的机制,它既能控制发送到网络的数据总量,又允许一定程度的突发数据发送。

令牌的概念解析

从名称来看,令牌桶似乎是一个装有令牌的容器。那么,究竟什么是令牌?

如同紫薇格格手中的令箭可以发号施令、令行禁止,在计算机系统中,令牌也代表着操作的授权。拥有令牌即获得执行权限,没有令牌则无法进行任何操作。

利用令牌构建限速器

假设1块令牌代表发送1字节数据的资格。如果程序能持续获得令牌,即可持续发送数据;反之,若不发放令牌,程序将被限流,无法发送数据。限速器的核心在于限制单位时间内的最大数据发送量。例如,若每秒发放10块令牌,则数据发送速率被限制为10bytes/s。若1秒内需发送超过10bytes的数据,超出部分因无令牌而被丢弃。

优化限速器:引入“桶”机制

 

前述限速器的速度是恒定的,但实际应用中常存在突发传输需求(即短时间内快速发送数据,但持续时间短且不会导致网络拥塞)。此类突发数据若遇到恒定限速器,会因无法获取令牌而被丢弃。

对限速器进行改进:虽然仍保持每秒产生10块令牌的速率,但将生成的令牌存入“桶”中。程序发送数据时从桶中取用令牌,不发送时令牌则在桶中累积。假设桶中已累积10块令牌,程序在1秒内最多可发送20bytes数据,从而满足突发传输需求。当桶中令牌耗尽后,下一秒最多仍只能发送10bytes数据,避免因持续大量发送而对网络造成压力。

 

15行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

总结

以上介绍了通过15行Python代码轻松理解令牌桶算法的过程,希望这对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。同时感谢大家对本站的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。