0

0

Python 实现限流算法示例

舞姬之光

舞姬之光

发布时间:2026-03-07 19:39:19

|

967人浏览过

|

来源于php中文网

原创

Python限流常用固定窗口、滑动窗口、令牌桶三种算法:固定窗口简单高效但有临界突发问题;滑动窗口精度高、内存开销略大;令牌桶支持突发流量,推荐生产使用,分布式场景建议Redis实现。

python 实现限流算法示例

Python 中实现限流(Rate Limiting)常用算法有三种:固定窗口、滑动窗口、令牌桶。选择哪种取决于你对精度、内存占用和并发安全的要求。

固定窗口计数器(简单高效,适合粗粒度限流)

将时间划分为固定长度的窗口(如 1 分钟),每个窗口独立计数。实现简单,但存在临界突发问题(窗口切换时可能翻倍放行)。

  • 用字典或 Redis 存储 key → {窗口开始时间, 请求次数},每次请求检查是否在当前窗口内
  • Python 示例(内存版,非线程安全,生产建议用 Redis 或加锁):
from time import time
from collections import defaultdict
<p>class FixedWindowLimiter:
def <strong>init</strong>(self, max_requests: int, window_seconds: int):
self.max_requests = max_requests
self.window_seconds = window_seconds
self.requests = defaultdict(list)  # key → [timestamp1, timestamp2, ...]</p><pre class="brush:php;toolbar:false;">def is_allowed(self, key: str) -> bool:
    now = int(time())
    window_start = (now // self.window_seconds) * self.window_seconds
    # 只保留当前窗口内的请求时间戳
    self.requests[key] = [
        t for t in self.requests[key]
        if window_start <= t < window_start + self.window_seconds
    ]
    if len(self.requests[key]) < self.max_requests:
        self.requests[key].append(now)
        return True
    return False

使用示例

limiter = FixedWindowLimiter(max_requests=5, window_seconds=60) print(limiter.is_allowed("user:123")) # True

滑动窗口日志(精度高,内存开销略大)

记录每次请求的精确时间戳,判断最近 N 秒内请求数是否超限。比固定窗口更平滑,但需维护有序时间序列(可用 deque 优化)。

  • 使用 collections.deque 保存时间戳,自动左弹出过期项
  • 每次请求前清理过期时间戳,再判断长度
from collections import deque
from time import time
<p>class SlidingWindowLimiter:
def <strong>init</strong>(self, max_requests: int, window_seconds: int):
self.max_requests = max_requests
self.window_seconds = window_seconds
self.requests = defaultdict(lambda: deque())</p><pre class="brush:php;toolbar:false;">def is_allowed(self, key: str) -> bool:
    now = time()
    window_start = now - self.window_seconds
    # 清理过期请求
    while self.requests[key] and self.requests[key][0] < window_start:
        self.requests[key].popleft()
    if len(self.requests[key]) < self.max_requests:
        self.requests[key].append(now)
        return True
    return False

立即学习Python免费学习笔记(深入)”;

OpenCV
OpenCV

开源计算机视觉库拥有超过2500个算法,提供详细的文档和实时计算机视觉的示例代码。它可以在Windows、Linux、Mac OS X、Android、iOS上运行,并通过JavaScript在您的浏览器中使用。语言:C++、Python、Julia、Javascript主页:https://opencv.org问答论坛:https://forum.opencv.org/文档:https://docs.opencv.org源代码:https://github.com/opencv请特别关注我们的教程!ht

下载

令牌桶(支持突发流量,推荐生产使用)

以恒定速率向桶中添加令牌,每次请求消耗一个令牌。桶有容量上限,允许短时突发(只要桶未空)。

  • 关键参数:桶容量(burst)、填充速率(rate per second)
  • 每次请求计算自上次以来应新增的令牌数,更新剩余令牌并判断
  • 注意浮点精度和并发安全(多线程建议用 threading.Lock 或用 Redis 实现)
from time import time
from threading import Lock
<p>class TokenBucketLimiter:
def <strong>init</strong>(self, capacity: int, fill_rate: float):
self.capacity = capacity
self.fill_rate = fill_rate  # tokens per second
self.tokens = capacity
self.last_refill = time()
self.lock = Lock()</p><pre class="brush:php;toolbar:false;">def _refill(self):
    now = time()
    elapsed = now - self.last_refill
    new_tokens = elapsed * self.fill_rate
    self.tokens = min(self.capacity, self.tokens + new_tokens)
    self.last_refill = now

def is_allowed(self) -> bool:
    with self.lock:
        self._refill()
        if self.tokens >= 1:
            self.tokens -= 1
            return True
        return False

使用示例:每秒最多 2 个请求,最多可突发 5 个

limiter = TokenBucketLimiter(capacity=5, fill_rate=2.0)

生产环境建议

单机服务可用上述内存实现(注意加锁);分布式场景必须依赖共享存储,推荐 Redis:

  • 固定窗口:用 INCR + EXPIRE 实现原子计数
  • 滑动窗口:用 ZSET 存时间戳,ZREMRANGEBYSCORE 清理过期项
  • 令牌桶:Redis + Lua 脚本保证原子性(如官方推荐的 rate limiting with Redis

不复杂但容易忽略:务必设置合理的 key 粒度(如 user_id、ip、api_path 组合),并考虑冷启动(首次请求时桶是否预热)和时钟漂移问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

404

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

250

2023.10.07

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

28

2026.01.21

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号