Comments (4)
A bit late to the party but for future reference I both tried monkey-patching sleep
and timedelta.total_seconds
without success.
I finally made it work with a lookup function:
def get_mysql_max_retry_time():
return int(os.getenv("MYSQL_MAX_RETRY_TIME", "150"))
@backoff.on_exception(backoff.expo, pymysql.err.MySQLError,
max_time=get_mysql_max_retry_time, jitter=backoff.full_jitter)
def ping:()
...
So you could probably monkeypatch
this function.
In my case, I'm using dotenv so I'm not monkeypatching but declared MYSQL_MAX_RETRY_TIME=0
in .env.test
.
This works great.
from backoff.
For unit testing functions with requests
calls in them, I recommend responses
https://github.com/getsentry/responses
With backoff in particular, if I expect the call to fail, I usually mock time.sleep()
to be a no-op.
However, I think that probably doesn't work with max_time, so this is a good question. I'd be willing to add a "best practice" regarding this to the backoff documentation once we figure out what that practice should be...
from backoff.
So I'm already using responses
for this exact test, so I'm good on that front. :-)
I actually tried mocking time.sleep()
just as it's done in the backoff
tests, but I land up getting an OverflowError:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.tox/py36/lib/python3.6/site-packages/backoff/_sync.py:109: in retry
seconds = _next_wait(wait, jitter, elapsed, max_time_)
.tox/py36/lib/python3.6/site-packages/backoff/_common.py:38: in _next_wait
seconds = jitter(value)
.tox/py36/lib/python3.6/site-packages/backoff/_jitter.py:28: in full_jitter
return random.uniform(0, value)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <random.Random object at 0x7fa8b689cc18>, a = 0, b = 179769313486231590...5356329624224137216
def uniform(self, a, b):
"Get a random number in the range [a, b) or [a, b] depending on rounding."
> return a + (b-a) * self.random()
E OverflowError: int too large to convert to float
.tox/py36/lib/python3.6/random.py:369: OverflowError
----------------------------------------------------------------------- Captured log call -----------------------------------------------------------------------
_common.py 75 ERROR Backing off get_ruleset(...) for 0.2s (RuntimeError: Unable to get latest ruleset: HTTP 404 Not Found)
_common.py 75 ERROR Backing off get_ruleset(...) for 1.2s (RuntimeError: Unable to get latest ruleset: HTTP 404 Not Found)
_common.py 75 ERROR Backing off get_ruleset(...) for 1.4s (RuntimeError: Unable to get latest ruleset: HTTP 404 Not Found)
_common.py 75 ERROR Backing off get_ruleset(...) for 7.3s (RuntimeError: Unable to get latest ruleset: HTTP 404 Not Found)
_common.py 75 ERROR Backing off get_ruleset(...) for 6.5s (RuntimeError: Unable to get latest ruleset: HTTP 404 Not Found)
from backoff.
FWIW, I just switched to max_tries
for now. I'll leave this open though for now.
from backoff.
Related Issues (20)
- Duplicate logging in some special cases HOT 1
- How do I use this?
- Obtain value returned by backoff_handler function after maximum tries is reached
- max_retries HOT 1
- max_time only applies _after_ first retry?
- Canonical way to handle error bursting
- Add exponential decay
- How to handle backoff on Facebook cursor? HOT 1
- Improve Typing and Error Handling in `on_exception`
- question about max_time
- Feature Request: add a way to use backoff in a context manager HOT 2
- feature request: toggle decorator on/off
- `backoff.on_predicate` does not work for `staticmethod`s
- Expose typing hints as they are part of the API
- Add support for globally disabling retries
- How to provide arguments to `on_backoff` function HOT 1
- Feature Request: support direct invocation with functools.partial
- Maintenance help? HOT 7
- README: `max_value` arg to `@backoff.on_predicate(backoff.fibo...)` -- if not obsolete, then maybe just confusing?
- Prevent error message in case of giveup using
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from backoff.