asyncio速率限制
项目描述
aiosteady是一个MIT许可的库,用Python编写,用于使用Redis和aioredis库在asyncio应用程序中进行速率限制。
aiosteady目前以非常有效的方式实现了漏桶算法。
max_capacity = 10 # The bucket can contain up to 10 drops, starts with 0
drop_recharge = 5.0 # 5 seconds between drop recharges.
throttler = Throttler(aioredis, max_capacity, drop_recharge)
# consume() returns information about success, the current bucket level,
# how long until the next drop recharges, etc.
res = await throttler.consume(f'user:{user_id}')
安装
要安装aiosteady,只需
$ pip install aiosteady
用法
漏桶算法遵循一个简单的模型。
一个桶包含一定数量的水滴,称为桶级别。桶从零滴开始。
桶具有最大水滴容量。
每次使用桶(消耗)都会在桶中插入一个或多个水滴,直到最大容量。如果桶会溢出,则消耗失败。
每秒会泄漏出一个水滴,每秒释放空间以便将新的水滴放入桶中。
桶还可以手动排空。
除了使消耗失败外,满桶还可以配置为在一段时间内阻止进一步消耗尝试。
创建一个aiosteady.leakybucket.Throttler实例,给它一个aioredis客户端实例和速率限制参数(最大桶容量、水滴泄漏所需的时间以及可选的阻塞持续时间)。
Throttler支持两种操作:消耗和窥视。
await Throttler.consume("a_key") (因为消耗桶资源称为 consume)尝试将指定数量的滴(默认1)放入指定的键的桶中。它返回一个 aiosteady.leakybucket.ThrottleResult 实例,包含以下字段:
success:一个布尔值,描述消耗是否成功
level:一个整数,描述桶的新水平
until_next_drop:一个浮点数,描述下一次滴再生后的剩余秒数
blocked_for:一个可选的浮点数,如果正在使用阻塞且桶被阻塞,则表示阻塞到期前的秒数
如果给定的滴的数量为负数,则相反地从桶中移除滴。桶的滴数可能不会低于零。
await Throttler.peek("a_key") 返回相同的 ThrottleResult,但不尝试消耗任何滴。
这两个操作都使用 Lua 脚本通过单个 Redis 调用来实现。
变更日志
22.1.0(未发布)
切换到 CalVer。
添加 Python 3.10 支持。
添加对充电桶(移除现有滴)的支持。
将主分支名称从 master 切换到 main。
0.2.1 (2021-05-12)
改进 attrs 依赖规范,因为 attrs 使用 CalVer。
0.2.0 (2021-04-08)
使用 Redis 的 evalsha 而不是 eval,以提高效率。
0.1.0 (2021-03-07)
初始发布。
致谢
原子漏桶的 Lua Redis 脚本已被采纳并做了大量修改,来源于 Prorate 项目。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。