Skip to main content

轮询和重试的延迟迭代。

项目描述

图片 图片 图片 图片 图片 图片 图片 图片 图片

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属性用于聚合有关调用的统计信息。基本实现提供totalfailure计数。对象本身的接口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 查看哈希)

已上传 source

内置分布

waiter-1.3-py3-none-any.whl (7.0 kB 查看哈希

已上传 py3