轮询和重试的延迟迭代。
waiter的Python项目详细描述
python还需要另一个重试/轮询库吗? 它至少需要一个不与装饰器和函数耦合的。 装饰器阻止调用方自定义延迟选项, 并且围绕函数组织代码会妨碍对失败的任何自定义处理。
服务生是围绕迭代构建的, 因为重试/轮询的基础是一个缓慢执行的循环。 由此产生的界面更易于使用和更灵活, 将延迟算法与应用程序逻辑分离。
用法
创建
提供若干秒来无休止地重复,或任何可重复的秒数。
fromwaiterimportwaitwait(1)# 1, 1, 1, 1, ...wait([1]*3)# 1, 1, 1wait([0.5,0.5,60])# circuit breaker
Iterable延迟可以表示任何等待策略,还提供了常用算法的构造函数。
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, 4backoff<=5# set maximum delay 1, 2, 4, 5, 5, 5, ...backoff.random(-1,1)# add random jitter
迭代
然后像任何iterable一样简单地使用wait
对象,从而产生经过的时间量。
当然也支持超时。
fromwaiterimportwait,suppress,firstforelapsedinwait(delays):# first iteration is immediatewithsuppress(exception):# then each subsequent iteration sleeps as necessary...breakfor_inwait(delays,timeout):# standard convention for ignoring a loop variable...# won't sleep past the timeoutif...:breakresults=(...for_inwait(delays))# expressions are even easierfirst(predicate,results[,default])# filter for first true itemassertany(results)# perfect for tests too
功能
是的,提供了功能版本,而且实现起来很简单。
wait(...).throttle(iterable)# generate items from iterablewait(...).repeat(func,*args,**kwargs)# generate successive resultswait(...).retry(exception,func,*args,**kwargs)# return first success or re-raise exceptionwait(...).poll(predicate,func,*args,**kwargs)# return first success or raise StopIteration
decorator变量只是相应方法的部分应用程序。 注意装饰器语法不支持任意表达式。
backoff=wait(0.1)*2@backoff.repeating@backoff.retrying(exception)@backoff.polling(predicate)
但在现实世界中:
-
该函数可能不存在或简洁地写成λ。
谓词可能不存在,也可以简洁地写成lambda <李>
- 可能需要记录
- 对不同的异常或结果可能有复杂的处理
因此,考虑块形式,就像装饰器不会呈现多余的with
块一样。
另请注意wait
对象是可重写的,前提是它们的原始延迟是。
异步
在python>;=3.6中,waiters还支持异步迭代。
throttle
可选地接受异步。
repeat
、retry
和poll
可选地接受协程函数。
统计
waiter对象有一个stats
属性,用于聚合有关所做调用的统计信息。
基本实现提供total
和failure
计数。
对象本身的接口暂时被认为是临时的,
但是可以通过重写Stats
类属性来扩展。
这还允许自定义iterable值;默认值是经过的时间。
安装
$ pip install waiter
依赖关系
- 多方法(如果python>;=3.6)
测试
100%分行覆盖。
$ pytest [--cov]
更改
1.0
- 将函数分批映射到iterable中
0.6
- 可扩展的iterable值和统计信息
- 附加构造函数:fibonacci,多项式,累加
0.5
- 异步迭代
0.4
- 装饰器支持方法
- 可节流阀
0.3
- 服务生的行为就像iterables而不是迭代器
- 支持函数装饰器
0.2
suppress
用于异常处理的上下文管理器repeat
解耦迭代法first
方便过滤的功能