Skip to content

Commit ff45b77

Browse files
committed
https://github.com/litl/backoff/pull/150
Fix to allow trio event loop sleep.
1 parent d82b23c commit ff45b77

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

backoff/_async.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# coding:utf-8
2-
import datetime
2+
import time
33
import functools
44
import asyncio
5-
from datetime import timedelta
65

76
from backoff._common import (_init_wait_gen, _maybe_call, _next_wait)
87

@@ -41,6 +40,8 @@ def retry_predicate(target, wait_gen, predicate,
4140
*,
4241
max_tries, max_time, jitter,
4342
on_success, on_backoff, on_giveup,
43+
monotonic_time=None,
44+
sleep=None,
4445
wait_gen_kwargs):
4546
on_success = _ensure_coroutines(on_success)
4647
on_backoff = _ensure_coroutines(on_backoff)
@@ -60,11 +61,11 @@ async def retry(*args, **kwargs):
6061
max_time_value = _maybe_call(max_time)
6162

6263
tries = 0
63-
start = datetime.datetime.now()
64+
start = (monotonic_time or time.monotonic)()
6465
wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
6566
while True:
6667
tries += 1
67-
elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
68+
elapsed = (monotonic_time or time.monotonic)() - start
6869
details = {
6970
"target": target,
7071
"args": args,
@@ -102,7 +103,7 @@ async def retry(*args, **kwargs):
102103
# See for details:
103104
# <https://groups.google.com/forum/#!topic/python-tulip/yF9C-rFpiKk>
104105
# <https://bugs.python.org/issue28613>
105-
await asyncio.sleep(seconds)
106+
await (sleep or asyncio.sleep)(seconds)
106107
continue
107108
else:
108109
await _call_handlers(on_success, **details, value=ret)
@@ -117,6 +118,7 @@ def retry_exception(target, wait_gen, exception,
117118
*,
118119
max_tries, max_time, jitter, giveup,
119120
on_success, on_backoff, on_giveup, raise_on_giveup,
121+
sleep=None, monotonic_time=None,
120122
wait_gen_kwargs):
121123
on_success = _ensure_coroutines(on_success)
122124
on_backoff = _ensure_coroutines(on_backoff)
@@ -134,11 +136,11 @@ async def retry(*args, **kwargs):
134136
max_time_value = _maybe_call(max_time)
135137

136138
tries = 0
137-
start = datetime.datetime.now()
139+
start = (monotonic_time or time.monotonic)()
138140
wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
139141
while True:
140142
tries += 1
141-
elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
143+
elapsed = (monotonic_time or time.monotonic)() - start
142144
details = {
143145
"target": target,
144146
"args": args,
@@ -180,7 +182,7 @@ async def retry(*args, **kwargs):
180182
# See for details:
181183
# <https://groups.google.com/forum/#!topic/python-tulip/yF9C-rFpiKk>
182184
# <https://bugs.python.org/issue28613>
183-
await asyncio.sleep(seconds)
185+
await (sleep or asyncio.sleep)(seconds)
184186
else:
185187
await _call_handlers(on_success, **details)
186188

backoff/_decorator.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ def on_predicate(wait_gen: _WaitGenerator,
3333
on_success: Union[_Handler, Iterable[_Handler], None] = None,
3434
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
3535
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
36+
monotonic_time: Optional[Callable[[], float]] = None,
37+
sleep: Optional[Callable[[float], None]] = None,
3638
logger: _MaybeLogger = 'backoff',
3739
backoff_log_level: int = logging.INFO,
3840
giveup_log_level: int = logging.ERROR,
@@ -113,6 +115,8 @@ def decorate(target):
113115
on_success=on_success,
114116
on_backoff=on_backoff,
115117
on_giveup=on_giveup,
118+
monotonic_time=monotonic_time,
119+
sleep=sleep,
116120
wait_gen_kwargs=wait_gen_kwargs
117121
)
118122

backoff/_sync.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# coding:utf-8
2-
import datetime
32
import functools
43
import time
5-
from datetime import timedelta
64

75
from backoff._common import (_init_wait_gen, _maybe_call, _next_wait)
86

@@ -24,6 +22,8 @@ def retry_predicate(target, wait_gen, predicate,
2422
*,
2523
max_tries, max_time, jitter,
2624
on_success, on_backoff, on_giveup,
25+
monotonic_time=None,
26+
sleep=None,
2727
wait_gen_kwargs):
2828

2929
@functools.wraps(target)
@@ -32,11 +32,11 @@ def retry(*args, **kwargs):
3232
max_time_value = _maybe_call(max_time)
3333

3434
tries = 0
35-
start = datetime.datetime.now()
35+
start = (monotonic_time or time.monotonic)()
3636
wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
3737
while True:
3838
tries += 1
39-
elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
39+
elapsed = (monotonic_time or time.monotonic)() - start
4040
details = {
4141
"target": target,
4242
"args": args,
@@ -65,7 +65,7 @@ def retry(*args, **kwargs):
6565
_call_handlers(on_backoff, **details,
6666
value=ret, wait=seconds)
6767

68-
time.sleep(seconds)
68+
(sleep or time.sleep)(seconds)
6969
continue
7070
else:
7171
_call_handlers(on_success, **details, value=ret)
@@ -80,6 +80,7 @@ def retry_exception(target, wait_gen, exception,
8080
*,
8181
max_tries, max_time, jitter, giveup,
8282
on_success, on_backoff, on_giveup, raise_on_giveup,
83+
monotonic_time=None,
8384
wait_gen_kwargs):
8485

8586
@functools.wraps(target)
@@ -88,11 +89,11 @@ def retry(*args, **kwargs):
8889
max_time_value = _maybe_call(max_time)
8990

9091
tries = 0
91-
start = datetime.datetime.now()
92+
start = (monotonic_time or time.monotonic)()
9293
wait = _init_wait_gen(wait_gen, wait_gen_kwargs)
9394
while True:
9495
tries += 1
95-
elapsed = timedelta.total_seconds(datetime.datetime.now() - start)
96+
elapsed = (monotonic_time or time.monotonic)() - start
9697
details = {
9798
"target": target,
9899
"args": args,
@@ -124,7 +125,7 @@ def retry(*args, **kwargs):
124125
_call_handlers(on_backoff, **details, wait=seconds,
125126
exception=e)
126127

127-
time.sleep(seconds)
128+
(sleep or time.sleep)(seconds)
128129
else:
129130
_call_handlers(on_success, **details)
130131

0 commit comments

Comments
 (0)