轮询和重试的延迟迭代。
项目描述
Python 是否需要另一个重试/轮询库?它至少需要一个不与装饰器和函数耦合的。装饰器阻止调用者自定义延迟选项,并且围绕函数组织代码会阻碍任何自定义的故障处理。
Waiter 是围绕迭代构建的,因为重试/轮询的基础是一个缓慢执行的循环。生成的接口更易于使用且更灵活,将延迟算法与应用程序逻辑解耦。
用法
创建
提供若干秒以无限重复,或任何可迭代的秒数。
from waiter import wait
wait(1) # 1, 1, 1, 1, ...
wait([1] * 3) # 1, 1, 1
wait([0.5, 0.5, 60]) # circuit breaker
可迭代延迟可以表达任何等待策略,还提供了常用算法的构造函数。
wait.count(1) # incremental backoff 1, 2, 3, 4, 5, ...
wait(1) + 1 # alternate syntax 1, 2, 3, 4, 5, ...
wait.fibonacci(1) # 1, 1, 2, 3, 5, ...
wait.polynomial(2) # 0, 1, 4, 9, 16, ...
wait.exponential(2) # exponential backoff 1, 2, 4, 8, ...
backoff = wait(1) * 2 # alternate syntax 1, 2, 4, 8, ...
backoff[:3] # limit attempt count 1, 2, 4
backoff <= 5 # set maximum delay 1, 2, 4, 5, 5, 5, ...
backoff.random(-1, 1) # add random jitter
迭代
然后wait像任何可迭代对象一样简单地使用该对象,产生经过的时间量。当然也支持超时。
from waiter import wait, suppress, first
for elapsed in wait(delays): # first iteration is immediate
with suppress(exception): # then each subsequent iteration sleeps as necessary
...
break
for _ in wait(delays, timeout): # standard convention for ignoring a loop variable
... # won't sleep past the timeout
if ...:
break
results = (... for _ in wait(delays)) # expressions are even easier
first(predicate, results[, default]) # filter for first true item
assert any(results) # perfect for tests too
功能
是的,提供了功能版本,并且实现起来很简单。
wait(...).throttle(iterable) # generate items from iterable
wait(...).repeat(func, *args, **kwargs) # generate successive results
wait(...).retry(exception, func, *args, **kwargs) # return first success or re-raise exception
wait(...).poll(predicate, func, *args, **kwargs) # return first success or raise StopIteration
装饰器变体只是相应方法的部分应用。注意装饰器语法不支持任意表达式。
backoff = wait(0.1) * 2
@backoff.repeating
@backoff.retrying(exception)
@backoff.polling(predicate)
但在现实世界中:
- 该函数可能不存在或被简洁地写为 lambda
- 谓词可能不存在或被简洁地写为 lambda
- 可能需要记录
- 可能对不同的异常或结果进行复杂的处理
所以考虑块形式,就像装饰器不会使with块变得多余。还要注意wait对象是可重复的,前提是它们的原始延迟是。
异步
服务员也支持异步迭代。throttle可选地接受异步迭代。repeat, retry, 和poll可选地接受协程函数。
统计数据
Waiter 对象有一个stats属性用于聚合有关调用的统计信息。基本实现提供total和failure计数。对象本身的接口stats现在被认为是临时的,但可以通过覆盖Stats类属性来扩展。这也允许自定义可迭代值;经过的时间是默认值。
安装
% pip install waiter
依赖项
- 多方法
测试
100% 的分支机构覆盖率。
% pytest [--cov]
变化
1.3
- 需要 Python >=3.7
1.2
- 需要 Python >=3.6
1.1
- 从大小组流式传输
1.0
- 批量映射一个可迭代的函数
0.6
- 可扩展的可迭代值和统计信息
- 附加构造函数:斐波那契、多项式、累加
0.5
- 异步迭代
0.4
- 装饰器支持方法
- 可以限制迭代
0.3
- 服务员表现为可迭代对象而不是迭代器
- 支持函数装饰器
0.2
suppress用于异常处理的上下文管理器repeat解耦迭代方法first方便过滤的功能
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
waiter-1.3.tar.gz
(7.1 kB
查看哈希)
内置分布
waiter-1.3-py3-none-any.whl
(7.0 kB
查看哈希)