Retry

retry est une librairie développée par invl disponible sur Github et disponible via pip. Non maintenue depuis 2016, elle peut être considérée comme dépreciée mais apporte une fonctionnalité pratique très facilement. Lors de la récupération de ressources internes ou externes, il peut toujours y a voir un risque que celles-ci soient indisponibles. La librairie retry permet ainsi de recommencer une opération avec une liberté sur le nombre d'essais et le délai entre chaque.

$ pip install retry

Utilisée en décorateur, elle permet de relancer une fonction si-celle lève une exception. Plusieurs paramètres permettent de modifier son comportement :

  • exceptions : l'exception ou un tuple d'exception qui provoque le nouvel essai. Défaut : Exception.
  • tries : le nombre maximal d'essais. Défaut : -1 (infinité d'essai).
  • delay : délai initial entre les essais. Défaut : 0(s).
  • max_delay : délai maximal entre les essais. Défaut : None (pas de limite)
  • backoff : le facteur appliqué au temps d'attente entre chaque essai. Défaut : 1 (pas d'augmentation)
  • jitter : Le temps d'attente ajouté en chaque essai. Ce peut être un nombre fixe ou un random entre un tuple de 2 valeurs (min, max). Défault : 0 (pas d'augmentation)
  • logger : lo logger utilisé lors des échecs, désactivé si None. Default : retry.logging_logger.

from retry import retry

@retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger)
def foobar():
    ...
    flaky stuff
    ...

Il est aussi possible d'utiliser une fonction au lieu d'un décorateur avec la fonction à éxécuter en argument.

from retry import retry_call

def foobar():
    ...
    retry_call(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1,
               jitter=0,
               logger=logging_logger)