Python3, hace magia, desde la biblioteca de reintentos de errores más poderosa.

1. Introducción

Xiao Diaosi : Hermano Yu, he encontrado algunos problemas recientemente.
Xiaoyu : Oh, te has encontrado con muchos problemas, de lo contrario no puedes tomar la iniciativa para decírmelo.
Xiao Diaosi : Por desgracia~~ En el camino de prueba y error, cuanto más avanzo, más confundido estoy.
Xiaoyu : Eso es porque no usaste el método correcto.
Pequeño Diaosi : ¿Hay alguna manera de hacer esto?
Xiaoyu : No entiendes eso.
inserte la descripción de la imagen aquí
Xiao Diaosi : Entonces puedes enseñarme rápidamente~
Xiaoyu : Vuelve a intentarlo, puedes aprender sobre eso.
Xiao Diaosi : El uso de reintento es único, lo que no cumple con mis requisitos (wei) y solicitud (kou).
Xiaoyu : Entonces prueba la tenacidad Xiaodiaosi
: No, enséñame.
Xiaoyu : ... Este es otro día perdido.

2, tenacidad

Cuando llamamos a las interfaces web o a los rastreadores, a menudo nos encontramos con algunas fallas ocasionales en las solicitudes. En este momento, podemos pensar en repetir hasta el éxito, o imprimir un mensaje de error;
este enfoque no está disponible en programas simples. Incorrecto, pero en programas complejos o grandes. proyectos, este enfoque obviamente tiene muchos inconvenientes.
Y necesitamos usar un método de reintento de error , el pájaro viejo debería pensar en la tenacidad .
Así es, tenacity es probablemente la mejor biblioteca de reintentos de terceros en Python en este momento
, así que echemos un vistazo a continuación.

2.1 Instalación

Como biblioteca de terceros, nuestro primer paso debe ser instalar

pip install tenacity

Otras formas de instalar :

" Python3, elija Python para instalar automáticamente bibliotecas de terceros y ¡despídase de pip! ! "
" Python3: ¡Solo uso una línea de código para importar todas las bibliotecas de Python! !

2.2 Uso básico

La función central del reintento de error de tenacity es implementada por su decorador de reintento.
Cuando no se pasan parámetros al decorador de reintento de forma predeterminada, arrojará errores y reintentará de vez en cuando durante la operación de la función que decora.

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import random
from tenacity import retry

@retry
def demo_one():
	a = random.random()
	print(f'{
      
      a}')
	
	if a >= 0.1:
		raise Exception
demo_one()

Ejecución de resultados
inserte la descripción de la imagen aquí
A través de los resultados, puede ver que el cuerpo de la función genera cada vez un número aleatorio entre 0 y 1. Cuando el número aleatorio no exceda 0.1, dejará de arrojar errores, de lo contrario será atrapado por la tenacidad. inténtalo de nuevo ahora.

2.3 Número máximo de reintentos

Dado que nuestro tiempo es precioso, el número de reintentos también debe limitarse.

Podemos agregar un punto final a nuestro proceso de reintento de error "interminable" aprovechando la función stop_after_attempt
en tenacidad, pasada como el parámetro de parada en retry(), donde stop_after_attempt() acepta una entrada entera como número "máximo" de reintentos :

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

from tenacity import retry,stop_after_attempt

#设置错误重试,3次
@retry(stop = stop_after_attempt(3))

def demo_two():
    print(f'函数执行')

    raise  Exception

demo_two()

Resultados de la ejecución
inserte la descripción de la imagen aquí
A través de los resultados, se puede ver que la cuarta continuación de la ejecución arroja oficialmente el error de excepción correspondiente en la función y finaliza el proceso de reintento.

2.4 Tiempo máximo de reintento

Además de establecer el número de errores, también puede establecer el tiempo máximo de reintento, que se establece
mediante la función stop_after_delay() Si se supera este tiempo, el proceso de reintento finalizará.

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import  time
from tenacity import  retry,stop_after_delay

#设置重试最大超时时长为4秒
@retry(stop = stop_after_delay(4))

def demo_three():
	#每次时间间隔为2秒
    time.sleep(2)
    print(f'已过去 {
      
      time.time() - start_time} 秒')
    raise  Exception

start_time = time.time()
demo_three()

resultado de la operación
inserte la descripción de la imagen aquí

2.5 Condiciones combinadas de parada de reintento

Si necesita agregar la cantidad máxima de reintentos y el límite máximo de tiempo de espera al mismo tiempo ,
solo necesita usar el |operador luego pasar el parámetro de detención de reintento().

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import  time
import random
from tenacity import retry,stop_after_attempt,stop_after_delay

#函数执行重试超过3秒或次数大于5次时均可以结束重试
@retry(stop =(stop_after_attempt(3) | stop_after_delay(5)))
def  demo_four():
    time.sleep(random.random())
    print(f'已过去 {
      
      time.time() - start_time} 秒')

    raise Exception

#开始时间
start_time = time.time()
demo_four()

resultado de la operación
inserte la descripción de la imagen aquí

2.6 Intervalo de reintento adyacente

Tenacity proporciona una serie de funciones muy prácticas, junto con el parámetro de espera de retry(), para ayudarnos a manejar adecuadamente el intervalo de tiempo entre reintentos adyacentes. Las más prácticas son principalmente las siguientes dos formas:

  • intervalo de tiempo fijo ;
  • intervalo de tiempo aleatorio ;

2.6.1 Intervalo de tiempo fijo

Utilice **wait_fixed()** con tenacidad para establecer un intervalo de espera fijo en segundos entre reintentos adyacentes

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import time
from tenacity import  retry,wait_fixed,stop_after_attempt

# 设置重试等待间隔为1秒
@retry(wait = wait_fixed(1),stop = stop_after_attempt(3))
def demo_five():
    print(f'已过去 {
      
      time.time() - start_time} 秒')

    raise  Exception
#开始时间
start_time = time.time()
demo_five()

resultado de la operación
inserte la descripción de la imagen aquí

2.6.2 Intervalo de tiempo aleatorio

Además de establecer un intervalo de tiempo fijo, tenacity también puede establecer un número aleatorio distribuido uniformemente para reintentos adyacentes a través de **wait_random()**, solo establezca el rango de distribución uniforme:

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import time
from tenacity import  retry,wait_random,stop_after_attempt

# 设置重试等待间隔为1到3之间的随机数
@retry(wait = wait_random(min=1,max=3),stop = stop_after_attempt(4))
def demo_six():
    print(f'已过去 {
      
      time.time() - start_time} 秒')

    raise  Exception
#开始时间
start_time = time.time()
demo_six()

resultado de la operación

inserte la descripción de la imagen aquí

2.7 Personalizar si activar un reintento

La estrategia por defecto de retry() en tenacity es volver a intentar cuando el proceso de ejecución de la función que decora " arroja algún error ",
pero en algunos casos, puede ser necesario capturar/ignorar tipos de error específicos, o capturar un cálculo anormal resultados.
Las funciones útiles relacionadas también están integradas en tenacidad:

  • Detectar o ignorar tipos de errores específicos ;
  • Función personalizada función de juicio de condición de resultado ;

2.7.1 Ignorar tipos de errores específicos

Use retry_if_exception_type() y retry_if_not_exception_type() con tenacidad, junto con el parámetro de reintento de retry(), para capturar o ignorar tipos de errores específicos:

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

'''
捕捉或忽略特定的错误类型
'''
from tenacity import retry,retry_if_exception_type,retry_if_not_exception_type

#retry_if_exception_type()
@retry(retry=retry_if_exception_type(FileExistsError))
def demo_seven():
    raise TimeoutError

demo_seven()

#retry_if_not_exception_type()
@retry(retry=retry_if_not_exception_type(FileNotFoundError))
def demo_eight():
    raise FileNotFoundError

demo_eight()

resultado de la operación

demostración_siete()
inserte la descripción de la imagen aquí
demostración_ocho()
inserte la descripción de la imagen aquí

2.7.2 Función de juicio de condición de resultado de función definida por el usuario

Podemos escribir una función de juicio condicional adicional y cooperar con retry_if_result() con tenacidad para implementar un juicio condicional personalizado sobre el resultado de retorno de la función, y la operación de reintento se activará solo cuando se devuelva True:

ejemplo de código

# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ

import  random
from tenacity import  retry,retry_if_result

@retry(retry = retry_if_result(lambda x: x >= 0.1))
def demo_nine():
    a =  random.random()
    print(f'{
      
      a}')
    return a

demo_nine()

resultado de la operación
inserte la descripción de la imagen aquí

3. Resumen

El compartir de hoy está aquí.
¿No es una postura extraña? Se ha vuelto a añadir.
También se agregó la pose de reintento incorrecto.
Siga a Xiaoyu para obtener más información sobre las bibliotecas de terceros de Python.

Supongo que te gusta

Origin blog.csdn.net/wuyoudeyuer/article/details/123911975
Recomendado
Clasificación