Saltar al pie de página
AYUDA DE PYTHON

Reintentando Funciones con Tenacity en Python

Al desarrollar programas fuertes y resilientes en el lenguaje de programación Python, es común tener que manejar suavemente errores temporales, particularmente al trabajar con servicios externos u operaciones de red. Aquí es donde la potente biblioteca de reintentos de propósito general en Python, Tenacity, resulta útil. Los desarrolladores pueden aumentar la fiabilidad y robustez de sus operaciones de generación de PDF combinando Tenacity con IronPDF, un marco rico en funciones para crear documentos PDF en aplicaciones Python.

Tenacity ofrece una estructura adaptable y personalizable para reintentar tareas que pueden fallar o generar excepciones debido a problemas transitorios como malfuncionamientos de red, tiempos de espera o interrupciones en el servicio. Tenacity simplifica el desarrollo de la lógica de reintento con su API amigable para el usuario y su extenso conjunto de características, liberando a los desarrolladores para que se concentren en crear sistemas fiables en lugar de preocuparse por los fallos pasajeros.

En este artículo, 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 robustez y fiabilidad de sus aplicaciones mientras proporcionan documentos PDF de alta calidad a los consumidores combinando el poder de Tenacity con IronPDF.

Reintento basado en decorador

Tenacity permite a los programadores usar decoradores de Python para agregar lógica de reintento a funciones o métodos. Gracias a esto, es sencillo agregar comportamiento de reintento a acciones específicas sin cambiar el código original.

Planes de reintento personalizables

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

Retroceso exponencial

Tenacity está a favor de la retroceso exponencial, una técnica popular actual de invocación de reintento en la que el intervalo entre intentos de reintento crece exponencialmente con el número de intentos en cada intento. Al hacer esto, se puede evitar inundar el servicio objetivo con solicitudes cuando hay mucho tráfico o congestión.

Jitter y aleatoriedad

Tenacity ofrece opciones para introducir jitter y aleatoriedad a los retrasos de reintento para prevenir problemas de sincronización y problemas de manada estampida. Esto disminuye la posibilidad de que varios clientes reintenten al mismo tiempo al distribuir los esfuerzos de reintento a lo largo del tiempo.

Condiciones y excepciones

Dependiendo del valor de retorno de la operación o de cualquier excepción generada, los desarrolladores pueden crear condiciones de reintento únicas. Esto permite regular precisamente cuándo y bajo qué condiciones deben realizarse los reintentos.

Tiempos y plazos

Tenacity facilita la creación de tiempos de espera generales de operación y plazos, garantizando que los intentos de reintento no se realicen indefinidamente y que las operaciones finalmente se terminen si tardan más de lo permitido.

Integración con frameworks populares de Python

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

Crear y configurar Tenacity

Retroceso exponencial

from tenacity import retry, wait_exponential

# Decorate the function with a retry mechanism
@retry(wait=wait_exponential(multiplier=1, min=1, max=10))
def my_function():
    # Your code logic here
    pass

# Explanation:
# - `multiplier`: Used to increase the interval between retries.
# - `min`: Minimum wait time in seconds between retries.
# - `max`: Maximum wait time allowed between retries.
from tenacity import retry, wait_exponential

# Decorate the function with a retry mechanism
@retry(wait=wait_exponential(multiplier=1, min=1, max=10))
def my_function():
    # Your code logic here
    pass

# Explanation:
# - `multiplier`: Used to increase the interval between retries.
# - `min`: Minimum wait time in seconds between retries.
# - `max`: Maximum wait time allowed between retries.
PYTHON

Jitter aleatorio

from tenacity import retry, wait_random

@retry(wait=wait_random(min=1, max=10))
def my_function():
    # Your code logic here
    pass

# Explanation:
# - `min`: Minimum random wait time in seconds between retries.
# - `max`: Maximum random wait time in seconds between retries.
from tenacity import retry, wait_random

@retry(wait=wait_random(min=1, max=10))
def my_function():
    # Your code logic here
    pass

# Explanation:
# - `min`: Minimum random wait time in seconds between retries.
# - `max`: Maximum random wait time in seconds between retries.
PYTHON

Personalización de las condiciones de reintento

Las excepciones personalizan los reintentos

from tenacity import retry, retry_if_exception_type

# Retry on specific exceptions like ConnectionError
@retry(retry=retry_if_exception_type(ConnectionError))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Retry only if a ConnectionError exception is raised during the function execution.
from tenacity import retry, retry_if_exception_type

# Retry on specific exceptions like ConnectionError
@retry(retry=retry_if_exception_type(ConnectionError))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Retry only if a ConnectionError exception is raised during the function execution.
PYTHON

Retribución basada en el valor de retorno

from tenacity import retry, retry_if_result

@retry(retry=retry_if_result(lambda result: result is None))
def my_function():
    # Your code logic here
    return some_result

# Explanation:
# Retry if the function result is `None`.
from tenacity import retry, retry_if_result

@retry(retry=retry_if_result(lambda result: result is None))
def my_function():
    # Your code logic here
    return some_result

# Explanation:
# Retry if the function result is `None`.
PYTHON

Condiciones de parada

from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(30))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Stop retrying after 30 seconds have elapsed since the first attempt.
from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(30))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Stop retrying after 30 seconds have elapsed since the first attempt.
PYTHON

Retorno de llamadas

from tenacity import retry, after_log
import logging

logger = logging.getLogger(__name__)

@retry(after=after_log(logger, logging.DEBUG))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Use a logger to log details of each retry attempt at the DEBUG level.
from tenacity import retry, after_log
import logging

logger = logging.getLogger(__name__)

@retry(after=after_log(logger, logging.DEBUG))
def my_function():
    # Your code logic here
    pass

# Explanation:
# Use a logger to log details of each retry attempt at the DEBUG level.
PYTHON

Empezando

¿Qué es IronPDF?

Podemos crear, editar y renderizar documentos PDF dentro de programas con la ayuda del popular kit de herramientas IronPDF. Trabaja con PDF de varias maneras: puedes convertir páginas HTML a PDF, agregar texto, imágenes y formas a documentos existentes y extraer texto e imágenes de documentos existentes. Incluso puedes crear nuevas páginas PDF desde contenido HTML, imágenes o datos en bruto.

IronPDF es increíblemente fácil de usar, lo que es una de sus principales ventajas. La API amigable para el usuario de Python y la extensa documentación hacen que sea simple para los desarrolladores comenzar a crear PDF desde dentro de sus proyectos. IronPDF también tiene dos características más: velocidad y eficiencia, que permiten a los desarrolladores crear documentos PDF de alta calidad rápidamente.

Algunas ventajas de IronPDF:

  • Transformar imágenes, datos en bruto y HTML en PDF.
  • Eliminar imágenes y texto de archivos PDF.
  • Agregar encabezados, pies de página y marcas de agua a archivos PDF.
  • Proteger archivos PDF con contraseñas y cifrado.
  • La capacidad de firmar electrónicamente y completar formularios.

Instalar bibliotecas

La instalación de las dependencias necesarias y la integración de ambas bibliotecas en tu flujo de trabajo de generación de PDF son los primeros pasos para usar Tenacity e IronPDF juntos en una aplicación Python.

pip install tenacity
pip install ironpdf
pip install tenacity
pip install ironpdf
SHELL

En tu script de Python, importa los módulos necesarios de Tenacity e IronPDF:

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

# Set up retry behavior on the PDF generating function
@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()
    # Render the HTML content as a PDF
    iron_pdf.render_html_as_pdf(html_content)
    # Save the generated PDF to a file
    iron_pdf.save_as_pdf("output.pdf")

# Explanation:
# - `@retry(stop=stop_after_attempt(3))`: Stop after 3 failed attempts.
# - `wait_fixed(2)`: Wait 2 seconds before each retry attempt.
from tenacity import retry, stop_after_attempt, wait_fixed
from IronPdf import IronPdf

# Set up retry behavior on the PDF generating function
@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()
    # Render the HTML content as a PDF
    iron_pdf.render_html_as_pdf(html_content)
    # Save the generated PDF to a file
    iron_pdf.save_as_pdf("output.pdf")

# Explanation:
# - `@retry(stop=stop_after_attempt(3))`: Stop after 3 failed attempts.
# - `wait_fixed(2)`: Wait 2 seconds before each retry attempt.
PYTHON

Llama a tu función para crear PDFs y pásale el texto HTML. Tenacity automáticamente reintentará la función según los parámetros de reintento preestablecidos si ocurre 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)

# Explanation:
# Attempt to generate a PDF and handle any exceptions that might occur during the process.
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)

# Explanation:
# Attempt to generate a PDF and handle any exceptions that might occur during the process.
PYTHON

Al modificar 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 bajo las cuales deberían ocurrir los reintentos, puedes alterar aún más el comportamiento de reintento. Tenacity incluye diferentes métodos de reintento y estrategias de reintento y condición de espera que puedes usar para ajustar el comportamiento de reintento según tus requisitos.

Muestra de resultados

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

Tenacity Python (Cómo funciona para desarrolladores): Figura 1 - Resultado esperado devuelto de reintento de salida de PDF

Conclusión

En resumen, Tenacity e IronPDF juntos proveen una solución potente para crear flujos de trabajo de generación de PDF robustos y fiables en aplicaciones Python. Los desarrolladores pueden asegurarse de que sus procesos de generación de PDF sean robustos y resilientes a los fallos temporales y reintentos al utilizar las potentes capacidades de generación de PDF de IronPDF y la lógica de reintento personalizable de Tenacity.

Con el extenso conjunto de características de Tenacity, los desarrolladores pueden ajustar precisamente las tácticas de reintento para múltiples condiciones, especificar criterios de reintento únicos, personalizar reintentos en excepciones e incluir opciones de configuración sofisticadas. Tenacity permite a los desarrolladores manejar de forma suave fallos momentáneos, como cortes de red o interrupciones de servicio, y garantiza que los procesos cruciales de creación de PDF se reintenten de inmediato.

En conclusión, los desarrolladores pueden crear soluciones de producción de PDF fiables y robustas que puedan manejar el rigor de 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.

Una licencia de por vida para IronPDF está incluida en el paquete por una tarifa razonable. Para muchos sistemas, el paquete está disponible por un precio muy asequible $799. Los titulares de la licencia obtienen acceso a soporte técnico en línea las 24 horas. Visita la página de licencias para obtener detalles adicionales sobre la tarifa. Para obtener más información sobre los productos de Iron Software, visita la página de biblioteca.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más