Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/backoff/_sync.py: 11%
71 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
1# coding:utf-8
2import datetime
3import functools
4import time
5from datetime import timedelta
7from backoff._common import (_init_wait_gen, _maybe_call, _next_wait)
10def _call_handlers(hdlrs, target, args, kwargs, tries, elapsed, **extra):
11 details = {
12 'target': target,
13 'args': args,
14 'kwargs': kwargs,
15 'tries': tries,
16 'elapsed': elapsed,
17 }
18 details.update(extra)
19 for hdlr in hdlrs:
20 hdlr(details)
23def retry_predicate(target, wait_gen, predicate,
24 *,
25 max_tries, max_time, jitter,
26 on_success, on_backoff, on_giveup,
27 wait_gen_kwargs):
29 @functools.wraps(target)
30 def retry(*args, **kwargs):
31 max_tries_value = _maybe_call(max_tries)
32 max_time_value = _maybe_call(max_time)
34 tries = 0
35 start = datetime.datetime.now()
36 wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
37 while True:
38 tries += 1
39 elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
40 details = {
41 "target": target,
42 "args": args,
43 "kwargs": kwargs,
44 "tries": tries,
45 "elapsed": elapsed,
46 }
48 ret = target(*args, **kwargs)
49 if predicate(ret):
50 max_tries_exceeded = (tries == max_tries_value)
51 max_time_exceeded = (max_time_value is not None and
52 elapsed >= max_time_value)
54 if max_tries_exceeded or max_time_exceeded:
55 _call_handlers(on_giveup, **details, value=ret)
56 break
58 try:
59 seconds = _next_wait(wait, ret, jitter, elapsed,
60 max_time_value)
61 except StopIteration:
62 _call_handlers(on_giveup, **details)
63 break
65 _call_handlers(on_backoff, **details,
66 value=ret, wait=seconds)
68 time.sleep(seconds)
69 continue
70 else:
71 _call_handlers(on_success, **details, value=ret)
72 break
74 return ret
76 return retry
79def retry_exception(target, wait_gen, exception,
80 *,
81 max_tries, max_time, jitter, giveup,
82 on_success, on_backoff, on_giveup, raise_on_giveup,
83 wait_gen_kwargs):
85 @functools.wraps(target)
86 def retry(*args, **kwargs):
87 max_tries_value = _maybe_call(max_tries)
88 max_time_value = _maybe_call(max_time)
90 tries = 0
91 start = datetime.datetime.now()
92 wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
93 while True:
94 tries += 1
95 elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
96 details = {
97 "target": target,
98 "args": args,
99 "kwargs": kwargs,
100 "tries": tries,
101 "elapsed": elapsed,
102 }
104 try:
105 ret = target(*args, **kwargs)
106 except exception as e:
107 max_tries_exceeded = (tries == max_tries_value)
108 max_time_exceeded = (max_time_value is not None and
109 elapsed >= max_time_value)
111 if giveup(e) or max_tries_exceeded or max_time_exceeded:
112 _call_handlers(on_giveup, **details, exception=e)
113 if raise_on_giveup:
114 raise
115 return None
117 try:
118 seconds = _next_wait(wait, e, jitter, elapsed,
119 max_time_value)
120 except StopIteration:
121 _call_handlers(on_giveup, **details, exception=e)
122 raise e
124 _call_handlers(on_backoff, **details, wait=seconds,
125 exception=e)
127 time.sleep(seconds)
128 else:
129 _call_handlers(on_success, **details)
131 return ret
132 return retry