The Python wiki has a
Retry decorator example which retries calling a failure-prone function
using an
exponential backoff algorithm. I modified it slightly to check
for exceptions instead of a False return value to indicate
failure. Each time the decorated function throws an exception, the decorator
will wait a period of time and retry calling the function until the maximum
number of tries is used up. If the decorated function fails on the last try,
the exception will occur unhandled.
import time
def retry(ExceptionToCheck, tries=4, delay=3, backoff=2):
"""Retry decorator
original from http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
"""
def deco_retry(f):
def f_retry(*args, **kwargs):
mtries, mdelay = tries, delay
try_one_last_time = True
while mtries > 1:
try:
f(*args, **kwargs)
try_one_last_time = False
break
except ExceptionToCheck, e:
print "%s, Retrying in %d seconds..." % (str(e), mdelay)
time.sleep(mdelay)
mtries -= 1
mdelay *= backoff
if try_one_last_time:
f(*args, **kwargs)
return
return f_retry # true decorator
return deco_retry
Try an "always fail" case:
@retry(Exception, tries=4)
def test_fail(text):
raise Exception("Fail")
test_fail("it works!")
Results:
Fail, Retrying in 3 seconds... Fail, Retrying in 6 seconds... Fail, Retrying in 12 seconds... Traceback (most recent call last): File "retry_decorator.py", line 47, intest_fail("it works!") File "retry_decorator.py", line 26, in f_retry f(*args, **kwargs) File "retry_decorator.py", line 33, in test_fail raise Exception("Fail") Exception: Fail
Try a "success" case:
@retry(Exception, tries=4)
def test_success(text):
print "Success: ", text
test_success("it works!")
Results:
Success: it works!
Try a "random fail" case:
import random
@retry(Exception, tries=4)
def test_random(text):
x = random.random()
if x < 0.5:
raise Exception("Fail")
else:
print "Success: ", text
test_random("it works!")
Example results:
Fail, Retrying in 3 seconds... Success: it works!
I'm Eliot and this is my notepad for programming topics such as Python, Django, Ubuntu, Emacs, etc... more »