more_decorator.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from time import sleep
  2. from functools import wraps
  3. import logging
  4. logging.basicConfig()
  5. log = logging.getLogger("retry")
  6. def retry(f):
  7. @wraps(f)
  8. def wrapped_f(*args, **kwargs):
  9. MAX_ATTEMPTS = 5
  10. for attempt in range(1, MAX_ATTEMPTS + 1):
  11. try:
  12. return f(*args, **kwargs)
  13. except:
  14. log.exception("Attempt %s/%s failed : %s",
  15. attempt,
  16. MAX_ATTEMPTS,
  17. (args, kwargs))
  18. sleep(10 * attempt)
  19. log.critical("All %s attempts failed : %s",
  20. MAX_ATTEMPTS,
  21. (args, kwargs))
  22. return wrapped_f
  23. counter = 0
  24. @retry
  25. def save_to_database(arg):
  26. print "Write to a database or make a network call or etc."
  27. print "This will be automatically retried if exception is thrown."
  28. global counter
  29. counter += 1
  30. # This will throw an exception in the first call
  31. # And will work fine in the second call (i.e. a retry)
  32. if counter < 2:
  33. raise ValueError(arg)
  34. if __name__ == '__main__':
  35. save_to_database("Some bad value")