Mochis NoticiasTecnologíaUso del decorador de reintentos de Python para implementar el mecanismo de reintento
Mochis NoticiasTecnologíaUso del decorador de reintentos de Python para implementar el mecanismo de reintento
Tecnología

Uso del decorador de reintentos de Python para implementar el mecanismo de reintento

Uso del decorador de reintentos de Python para implementar el mecanismo de reintento

Estoy seguro de que habrá un momento en su viaje de aprendizaje o trabajo en el que necesitará volver a implementar un mecanismo para cumplir con una solicitud o función específica como de costumbre. Un mecanismo de reintento es un enfoque decente para darle una o más oportunidades de tener éxito, si las cosas van mal. Puede encontrar mecanismos de reintento en varias aplicaciones, como reintentar una solicitud de API en caso de que un servidor no funcione o algo así y mucho más.

En esta publicación de blog, lo guiaré a través de 2 enfoques para implementar el redecorador de Python que nos proporcionarán un elemento importante de nuestro redecorador: uno es usar la biblioteca incorporada de Python y el otro enfoque es crear una función simple para implementar nuevamente. mecanismo de nosotros mismos. Estoy seguro de que te encantará cualquiera de ellos, así que sin más preámbulos, profundicemos en los enfoques y comencemos a implementar el decorador de reintentos de Python.

¿Qué son los decoradores de Python?

Antes de implementar Python Retry Decorator, primero, veamos qué son exactamente los decoradores de Python. Bueno, también hay otras formas de reconstruir el mecanismo, pero aquí elegimos decoradores de Python para hacerlo.

Los decoradores de Python proporcionan sintaxis para llamar a funciones de orden superior que toman y devuelven funciones. Permiten que funciones «contenedores» extiendan comportamientos sin modificarlos permanentemente.

Los decoradores en Python se construyen usando @syntax:

Pitón

@my_decorator
def my_func():
  # Function body here

Esto se aplica @my_decorator a my_func() durante la definición. Los decoradores pueden modificar el comportamiento de una función e incluso reemplazarla por completo.

Aquí hay una lista de algunos de los decoradores de Python más conocidos que los programadores de Python suelen utilizar:

  1. @métododeclase
  2. @métodoabstracto
  3. @método estático
  4. @propiedad
  5. @singledispatch
  6. @lru_cache
  7. @autenticati
  8. @validar_entrada

Leer similares – Python SHA256: una implementación de hash segura

1. Uso de la biblioteca del decorador Reintentar Python

Python ofrece una increíble biblioteca de currículums que ofrece un decorador de currículums de Python que puede salvarle la vida. Este decorador de reintento de Python nos brinda muchas funcionalidades internas que facilitan mucho la tarea de implementar el mecanismo de reintento. Intentemos usarlo paso a paso:

Para comenzar, necesitamos reinstalar el paquete Python usando pip. A continuación se muestra el comando para instalar el paquete Python nuevamente:

pip install retry

Ahora, para usar esto, cree un nuevo archivo Python e importe el paquete nuevamente al archivo para comenzar a usarlo.

Pitón

from retry import retry

A continuación se explica cómo puede utilizar un decorador de reintento de Python con una función que nos obtiene la dirección de correo electrónico:

Pitón

@retry((ValueError, TypeError), tries=3, delay=2)
def get_email():
  """ It triggers retry if there's a ValueError or TypeError after 3 attempts and sleep 2 seconds between attempts."""

Según la documentación de Reintento, requiere los siguientes parámetros:

Pitón

@retry(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, delay=0, 
        max_delay=None, backoff=1, jitter=0, logger=logging_logger)

Aquí:

  • Exceptions es una tupla que toma las excepciones como entrada sobre la cual necesitamos activar el mecanismo nuevamente.
  • tries es otro parámetro que representa el número de intentos.
  • delay es el retraso inicial en segundos entre intentos.
  • max_delay es el valor máximo de retraso.
  • backoff es el multiplicador que se aplica al retraso entre intentos para aumentar el retraso después de cada ciclo.

Estos fueron los parámetros que más utilizarás, si quieres conocer los demás también te sugiero que visites la documentación de reprovo.

Leer similares – Algoritmo de ventana deslizante: explicado con un ejemplo

2. Creación de la función decoradora de reintentos de Python

Ahora, en este segundo enfoque, vamos a crear una función decoradora de reintentos de Python que ejecute lo mismo que nuestra biblioteca de reintentos. Así es como podemos construir una función nuevamente:

Pitón

import time
import random


def retry(f, exceptions, tries=4, delay=3, max_delay=None, backoff=2):
    """ 
    Retry calling the decorated function using an exponential backoff.

    Args:
        f: The function to decorate and retry
        exceptions: An exception or tuple of exceptions to catch.
        tries: Number of times to try (not retry) before giving up. 
        delay: Initial delay between retries in seconds.
        max_delay: Max delay in seconds (or None for no max).
        backoff: Backoff multiplier e.g. value of 2 will double the delay each retry.
    """

    def wrapper(*args, **kwargs):
        mtries, mdelay = tries, delay

        while mtries > 1:
            try:
                return f(*args, **kwargs)
            except exceptions as e:
                msg = "%s, Retrying in %d seconds..." % (str(e), mdelay)
                print(msg)

                time.sleep(mdelay)
                mtries -= 1
                mdelay *= backoff

                if max_delay and mdelay > max_delay:
                    mdelay = max_delay

        return f(*args, **kwargs)

    return wrapper  
    
@retry(exceptions=ValueError, tries=4, delay=5, backoff=2)
def flaky_function():
    # Some logic here that might raise ValueError randomly
    if random.randint(1,3) != 1:
        raise ValueError("Broken")

    print("Success!")

flaky_function()

Aquí hemos creado nuevamente una función que actuará nuevamente como decorador de Python y la colocaremos encima de flaky_function() con algunos argumentos. Esto funcionará exactamente como lo hace nuestra biblioteca Python nuevamente. Puede intentar implementar esta función nuevamente localmente y ver si funciona como desea.

¡Eso es todo por usar Python Retry Decorator!

Conclusión

Para concluir, primero entendimos qué es un decorador de Python, es decir, se usa para llamar a funciones de orden superior que toman y devuelven funciones. Luego, observe dos enfoques para implementar el decorador de reintentos de Python, que son: mediante el uso de la biblioteca de reintentos en Python y otro enfoque es escribir nuestro propio código pequeño para el decorador de reintentos de Python.

Ambos enfoques le ayudan a implementar el mecanismo de redecoración de Python para activar el reintento cuando sea necesario.

Leer más:

Preguntas frecuentes

  1. ¿Qué problema resuelve el redecorador de Python?

    Retry Decorator automatiza las llamadas a funciones repetidas que fallan de forma intermitente hasta alcanzar el éxito, lo que simplifica enormemente el código de manejo de errores requerido para los sistemas tolerantes a fallas.

  2. ¿Qué lógica reencapsulan detrás de escena?

    Detalles complejos como el manejo de excepciones transitorias, el retraso entre reintentos, el establecimiento de condiciones de detención, el manejo de abortos, etc. están integrados dentro de los decoradores de reintentos.

  3. ¿Qué excepciones deberían provocar un reintento en lugar de aumentar al usuario?

    Lo ideal es intentarlo de nuevo en caso de problemas temporales, como pérdida temporal de conexión o fallas en la red. Pero sufren fallas permanentes causadas por entradas incorrectas o escenarios no compatibles para el usuario.

  4. ¿Cómo evitar interminables intentos inútiles?

    Establezca valores predeterminados saludables, como un máximo de 5 intentos en total o 2 minutos de reintentos en total. Los intervalos de reintento se reducen exponencialmente para aliviar la carga. Utilice reintentos condicionales sólo para excepciones específicas.

  5. ¿Cuándo debo evitar volver a usar decoradores en Python?

    Evite reintentos para operaciones no idempotentes, como guardar datos o enviar correos electrónicos duplicados. Además, si varios intentos hacen que el resultado no sea determinista.

  6. ¿Qué es un buen multiplicador de retraso y retroceso de reinicio?

    Para las API, es razonable oscilar entre 1 y 5 segundos con un multiplicador de retroceso de 2x. Presione los valores según la tolerancia al retraso versus el riesgo de fallas temporales del sistema.

  7. ¿Se puede aplicar selectivamente un decorador de reintento de Python solo a partes de un programa?

    Sí, los decoradores de Python se integran de forma no invasiva envolviendo solo funciones seleccionadas. No es necesario volver a aplicar intentos globalmente.

Source link

Hi, I’m Corina Guzman

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *