AYUDA DE PYTHON

Reintentar funciones con Tenacity en Python

Publicado en 1 de julio, 2024
Compartir:

Al desarrollar programas sólidos y resistentes en el lenguaje de programación Python, es habitual tener que gestionar con elegancia errores temporales, sobre todo cuando se trabaja con servicios externos u operaciones de red. Aquí es donde la potente biblioteca de reintento de propósito general de Python Tenacity resulta útil. Los desarrolladores pueden aumentar la fiabilidad y solidez de sus operaciones de generación de PDF combinando Tenacity con IronPDF, un marco de trabajo rico en funciones para crear documentos PDF en aplicaciones Python.

Tenacity ofrece una estructura adaptable y personalizable para reintentar tareas que pueden fracasar o provocar excepciones debido a problemas transitorios como fallos de red, tiempos de espera o interrupciones del servicio. Tenacity simplifica el desarrollo de la lógica de reintento con su API de fácil uso y su amplio conjunto de funciones, lo que permite a los desarrolladores concentrarse en crear sistemas fiables en lugar de preocuparse por fallos pasajeros.

En este post, repasaremos las ventajas de integrar la biblioteca Tenacity con IronPDF, presentaremos ejemplos prácticos y ofreceremos consejos sobre cómo crear procesos de generación de PDF fiables en aplicaciones Python. Los desarrolladores pueden mejorar la solidez y fiabilidad de sus aplicaciones y, al mismo tiempo, ofrecer a los consumidores documentos PDF de alta calidad combinando la potencia de Tenacity con IronPDF.

Reintento basado en decoradores

Tenacity permite a los programadores utilizar decoradores de Python para añadir lógica de reintento a funciones o métodos. Gracias a esto, añadir el comportamiento de reintento a acciones concretas sin cambiar el código original es sencillo.

Planes de reintento personalizables

Tenacity ofrece varios parámetros ajustables para especificar los planes de reintento. Los desarrolladores pueden personalizar el número máximo de reintentos, el intervalo entre ellos y las circunstancias en las que deben producirse.

Retroceso exponencial

Tenacity está a favor del backoff exponencial, una popular técnica actual de invocación de reintentos en la que el intervalo entre reintentos crece exponencialmente con el número de intentos en cada intento. De este modo, puede evitar inundar el servicio de destino con peticiones cuando haya mucho tráfico o congestión.

Fluctuación de fase y aleatoriedad

Tenacity ofrece opciones para introducir fluctuación y aleatoriedad en los retardos de reintento con el fin de evitar problemas de sincronización y problemas de manada atronadora. De este modo se reduce la posibilidad de que varios clientes reintenten a la vez, repartiendo los esfuerzos de reintento a lo largo del tiempo.

Condiciones de reintento y excepciones

En función del valor de retorno de la operación o de las excepciones que se produzcan, los desarrolladores pueden crear condiciones de reintento únicas. Esto permite regular con precisión cuándo y en qué condiciones deben realizarse los reintentos.

Tiempos y plazos

Tenacity facilita la creación de tiempos de espera y plazos generales de las operaciones, garantizando que no se realicen intentos de reintento indefinidos y que las operaciones se terminen en última instancia si duran más de unos umbrales predeterminados.

Integración con marcos populares de Python

Flask, Django y Celery son solo algunos de los marcos con los que Tenacity interactúa fácilmente. Esto simplifica a los desarrolladores la tarea de añadir lógica de reintento a operaciones en segundo plano, puntos finales web o cualquier otra parte de sus sistemas.

Crear y configurar Tenacity

Retroceso exponencial

from tenacity import wait_exponential

# Exponential backoff sleeping
@retry(wait=wait_exponential(multiplier=1, min=1, max=10))
def my_function():
    ...
PYTHON
  • multiplicador: Para alargar el intervalo entre reintentos, utiliza el multiplicador exponencial.
  • min: La menor cantidad de tiempo entre ensayos.
  • max: El intervalo más largo entre el número de intentos realizados.

Fluctuación aleatoria

from tenacity import wait_random

@retry(wait=wait_random(min=1, max=10))
def my_function():
    ...
PYTHON
  • min: El límite arbitrario más pequeño por el número de intervalos entre ensayos.
  • max: El mayor límite arbitrario por el número de intervalos entre el número de intentos realizados.

Personalización de las condiciones de reintento

Las excepciones personalizan los reintentos

from tenacity import retry_if_exception_type

# Coroutines retry code block, exceptions customize retrying
@retry(retry=retry_if_exception_type(ConnectionError))
def my_function():
    ...
PYTHON

Vuelva a intentarlo sólo en caso de que el tipo de excepción planteada(en este caso, ConnectionError) se proporciona un mensaje de error.

Reintento basado en el valor de retorno

from tenacity import retry_if_result

# Retry forever ignoring exceptions code block
@retry(retry=retry_if_result(lambda result: result is None))
def my_function():
    ...
PYTHON

Inténtelo de nuevo sólo en el caso de que el método devuelva Ninguno.

Condiciones de parada

from tenacity import stop_after_delay

@retry(stop=stop_after_delay(30))
def my_function():
    ...
PYTHON

Después de un tiempo predeterminado(por ejemplo, 30 segundos)deja de intentarlo.

Devolución de llamada

from tenacity import after_log

# Custom callbacks
@retry(after=after_log(logger, logging.DEBUG))
def my_function():
    ...
PYTHON

El atributo retry asociado a la función y sus intentos deben registrarse utilizando un registrador designado(como un logger) y elevar un nivel de registro específico(comoDEBUG`).

Primeros pasos

¿Qué es IronPDF?

Podemos crear, editar y renderizar documentos PDF dentro de programas con la ayuda del popular conjunto de herramientas IronPDF. Trabaje con PDF de diversas formas: puede convertir páginas HTML en PDF, añadir texto, imágenes y formas a los que ya existen y extraer texto e imágenes de los que ya existen. Incluso puede crear nuevas páginas PDF a partir de contenido HTML, imágenes o datos sin procesar.

IronPDF es increíblemente fácil de usar, lo que constituye una de sus principales ventajas. La sencilla API de Python y su extensa documentación facilitan a los desarrolladores la creación de archivos PDF desde sus proyectos. IronPDF también tiene dos características más: velocidad y eficacia, que permiten a los desarrolladores crear documentos PDF de alta calidad rápidamente.

Algunas ventajas de IronPDF:

  • Transformación de imágenes, datos sin procesar y HTML en PDF.
  • Eliminar imágenes y texto de archivos PDF.
  • Añadir encabezados, pies de página y marcas de agua a archivos PDF.
  • Proteger archivos PDF con contraseñas y cifrado.
  • Capacidad para firmar y cumplimentar formularios electrónicamente.

Instalar bibliotecas

Instalar las dependencias necesarias e integrar ambas bibliotecas en su flujo de trabajo de generación de PDF son los primeros pasos para utilizar Tenacity e IronPDF juntos en una aplicación Python.

pip install tenacity
pip install ironpdf

En su script Python, importe los módulos necesarios de Tenacity y IronPDF:

from tenacity import retry, stop_after_attempt, wait_fixed
from IronPdf import IronPdf
PYTHON

Utilice el decorador Tenacity @retry para adornar su método de generación de PDF y establecer el comportamiento de reintento, como reintentar para siempre:

@retry(
    stop=stop_after_attempt(3),   # Stop retrying after 3 attempts
    wait=wait_fixed(2)            # Wait 2 seconds between retry attempts
)
def generate_pdf(html_content):
    iron_pdf = IronPdf()
    iron_pdf.render_html_as_pdf(html_content)
    iron_pdf.save_as_pdf("output.pdf")
PYTHON

@reintentar(stop=parada_después_del_intento(3)): Indica que después de tres intentos, la función debe dejar de intentar reintentar la llamada de nuevo. wait_fixed(2): Indica que debe haber una pausa de 2 segundos entre cada intento de reintento de llamada.

Llame a su función de creación de PDF y pásele el texto HTML. Tenacity reintentará automáticamente la función de acuerdo con los parámetros de reintento preestablecidos si se produce una excepción.

try:
    html_content = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
    generate_pdf(html_content)
    print("PDF generated successfully")
except Exception as e:
    print("Failed to generate PDF:", e)
PYTHON

Modificando factores como el número de reintentos, la condición de reintento y la condición de espera, el intervalo entre reintentos y las circunstancias en las que deben producirse los reintentos, puedes alterar aún más el comportamiento de los reintentos. Tenacity incluye diferentes métodos de reintento y estrategias de condiciones de reintento y espera que puede utilizar para ajustar el comportamiento de reintento según sus necesidades.

Muestra de resultados

A continuación se muestra la salida generada a partir del código anterior:

Tenacidad Python(Cómo funciona para desarrolladores): Figura 1 - Resultado devuelto esperado reintentar salida PDF

Conclusión

En resumen, Tenacity y IronPDF juntos proporcionan una solución potente para crear flujos de trabajo de generación de PDF sólidos y fiables en aplicaciones Python. Los desarrolladores pueden asegurarse de que sus procesos de generación de PDF son sólidos y resistentes a fallos temporales y reintentos utilizando las potentes funciones de generación de PDF de IronPDF y la lógica de reintento personalizable de Tenacity.

Con el amplio conjunto de funciones de Tenacity, los desarrolladores pueden ajustar con precisión las tácticas de reintento para múltiples condiciones, especificar criterios de reintento únicos, personalizar los reintentos en caso de excepción e incluir sofisticadas opciones de configuración. Tenacity permite a los desarrolladores gestionar con elegancia fallos momentáneos, como caídas de la red o interrupciones del servicio, y garantiza que los procesos cruciales de creación de PDF se reintenten inmediatamente.

En conclusión, los desarrolladores pueden crear soluciones de producción de PDF fiables y sólidas que pueden soportar los rigores de los entornos del mundo real utilizando Tenacity con IronPDF. Esta combinación ofrece una base sólida para crear flujos de trabajo de generación de PDF fiables y escalables en aplicaciones Python, independientemente de si el flujo de trabajo es para producir facturas, informes o documentos.

El paquete incluye una licencia vitalicia de IronPDF por un precio razonable. Para muchos sistemas, el paquete está disponible por un precio muy asequible de 749 dólares. Los titulares de la licencia tienen acceso las 24 horas del día a asistencia técnica en línea. Visite la página de licencias para obtener más información sobre la tasa. Para obtener más información sobre los productos de Iron Software, vaya a la página de la biblioteca.

< ANTERIOR
OpenTelemetry en aplicaciones Python
SIGUIENTE >
Web Scraping con BeautifulSoup en Python

¿Listo para empezar? Versión: 2024.11.1 acaba de salir

Instalación pip gratuita Ver licencias >