Maison  >  Article  >  développement back-end  >  Solution pour réessayer lorsqu'une exception se produit

Solution pour réessayer lorsqu'une exception se produit

Y2J
Y2Joriginal
2017-05-13 14:00:232438parcourir

Cet article vous présente principalement la solution aux nouvelles tentatives anormales en Python. L'introduction dans l'article est très détaillée. Je pense qu'elle a une certaine valeur d'apprentissage de référence pour que tous les amis qui en ont besoin puissent apprendre ou utiliser Python. . Jetons un coup d'oeil.

Avant-propos

Lorsque tout le monde effectue une capture de données, ils rencontrent souvent des sauvegardes de programmes en raison de problèmes de réseau. Auparavant, ils n'enregistraient que des erreurs. et post-traitez le contenu de l'erreur.

Processus original :


def crawl_page(url):
 pass
 
def log_error(url):
 pass
 
url = ""
try:
 crawl_page(url)
except:
 log_error(url)

Processus amélioré :


attempts = 0
success = False
while attempts < 3 and not success:
 try:
  crawl_page(url)
  success = True
 except:
  attempts += 1
  if attempts == 3:
   break

Nouvelle solution récemment découverte : réessayer

réessayer est un Python Le package retry peut être utilisé pour réessayer automatiquement certains segments de programme susceptibles d'échouer. retrying Fournir une fonction de décorateur retry La fonction décorée sera réexécutée si elle échoue. Par défaut, elle continuera à réessayer tant qu'une erreur est signalée.


import random
from retrying import retry
 
@retry
def do_something_unreliable():
 if random.randint(0, 10) > 1:
  raise IOError("Broken sauce, everything is hosed!!!111one")
 else:
  return "Awesome sauce!"
 
print do_something_unreliable()

Si nous exécutons la fonction have_a_try, elle ne se terminera que lorsque random.randint renvoie 5, sinon elle sera réexécutée.

retry peut également accepter certains paramètres. Depuis la fonction d'initialisation de la classe Retrying dans le code source, vous pouvez voir les paramètres facultatifs :

  • s<a href="http://www.php.cn/wiki/904.html" target="_blank">top<p>_max_attempt_number</p></a> : utilisé pour définir le maximum Le nombre de tentatives cessera de réessayer s'il dépasse ce nombre s<a href="http://www.php.cn/wiki/904.html" target="_blank">top</a>_max_attempt_number
  •  : Par exemple, s'il est réglé sur 10000, il démarrera à partir du moment où le décoré La fonction commence à s'exécuter et se termine lorsque la fonction s'exécute avec succès. Ou au moment où l'échec est signalé et terminé. Tant que cette période dépasse 10 secondes, la fonction ne sera plus exécutée stop_max_delay

  • .
  •  : Régler le séjour entre deux wait_fixed Temps retrying

  •  : Générer le temps de séjour entre deux wait_random_min和wait_random_max de manière aléatoire retrying

  •  : Utiliser exponentielle Le formulaire génère le temps de séjour entre deux wait_exponential_multiplier和wait_exponential_max, et la valeur générée est retrying est le nombre de fois que 2^previous_attempt_number * wait_exponential_multiplier a été. fait avant. Si la valeur générée dépasse la taille de previous_attempt_number, alors les deux valeurs de maintien entre les nouvelles tentatives sont toutes retry. Cette conception répond à l'algorithme wait_exponential_max et peut atténuer les situations de blocage. wait_exponential_maxexponential backoff

  • Nous pouvons spécifier quelles exceptions nous voulons réessayer lorsqu'une exception se produit. Pour ce faire, utilisez retry_on_<a href="http://www.php.cn/.%20wiki/%20265.html" target="_blank">exception<li></a>Passer une fonction

    objetretry_on_<a href="http://www.php.cn/wiki/265.html" target="_blank">exception</a> :


Lors de l'exécution de la fonction
def retry_if_io_error(exception):
 return isinstance(exception, IOError)
 
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
 with open("file", "r") as f:
  return f.read()
, si une exception est signalée, l'exception sera transmise à la fonction

comme paramètre formel read_a_file Si exception est retry_if_io_error, alors exception, sinon, arrêtez de fonctionner et IOErrorlancez une exception retry.
Nous pouvons également spécifier à quels résultats aller

lorsque nous les obtenons. Cela nécessite d'utiliser

pour transmettre un objet fonction : retryretry_on_result


Après une exécution réussie de

, la valeur de retour
def retry_if_result_none(result):
 return result is None
 
@retry(retry_on_result=retry_if_result_none)
def get_result():
 return None
de la fonction

sera transmise à la fonction get_result sous la forme d'un paramètre formel si la valeur de retour est. puis Go result, sinon terminez et renvoyez la valeur de la fonction. retry_if_result_noneNoneretry

Résumé

[Recommandations associées]

1. 🎜>Spécialement recommandé

 : Téléchargement de la version "php Programmer Toolbox" V0.12. Tutoriel vidéo gratuit sur Python

3 Tutoriel d'introduction de base de Python

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn