Source code for weblib.control

import time
import logging
from random import randint

from weblib.py3k_support import *

logger = logging.getLogger('weblib.control')


[docs]def sleep(lower_limit, upper_limit): """ Sleep for random number of seconds in interval between `lower_limit` and `upper_limit` """ # Doing this math calculations # to call randint function with integer arguments # There is no random function which accepts float arguments lower_limit_float = int(lower_limit * 1000) upper_limit_float = int(upper_limit * 1000) sleep_time = randint(lower_limit_float, upper_limit_float) / 1000.0 logger.debug('Sleeping for %f seconds' % sleep_time) time.sleep(sleep_time)
[docs]def repeat(func, limit=3, args=None, kwargs=None, fatal_exceptions=(), valid_exceptions=()): """ Return value of execution `func` function. In case of error try to execute `func` maximum `limit` times and then raise latest exception. Example:: def download(url): return urllib.urlopen(url).read() data = repeat(download, 3, args=['http://google.com/']) """ for try_count in xrange(1, limit + 1): try: res = func(*(args or ()), **(kwargs or {})) except Exception as ex: if isinstance(ex, fatal_exceptions): raise elif valid_exceptions and not isinstance(ex, valid_exceptions): raise else: logging.error('', exc_info=ex) if try_count >= limit: logger.error('Too many errors while executing function %s' % func.__name__) raise else: return res