Декоратор, n-кратный перезапуск при исключении
def replay(cnt, sleep=0.1, log=None):
'''
Декоратор, n-кратный перезапуск при исключении
*cnt = сколько раз перезапускать
**sleep = задержка между перезапусками, линейно растёт с перезапусками
**log = функция для логгинга трейсбэков (например logging.debug)
'''
def decorator(func):
def wrapper(*args, **kwargs):
for i in xrange(replay_cnt):
if i:
s = sleep * i
if log:
log('--- REPLAY %i (%s), sleep %0.2f sec.' % (i, func.__name__, s))
time.sleep(s)
try:
return func(*args, **kwargs)
except (KeyboardInterrupt, SystemExit):
raise
except Exception, e:
pass
raise
return wrapper
return decorator