Skip to footer content
PYTHON HELP

Retrying Functions with Tenacity in Python

When developing strong and resilient programs in the Python programming language, it's common to have to gracefully handle temporary errors, particularly when working with external services or network operations. This is where the potent Python general-purpose retrying library Tenacity comes in handy. Developers can increase the dependability and robustness of their PDF generation operations by combining Tenacity with IronPDF, a feature-rich framework for creating PDF documents in Python applications.

Tenacity offers an adaptable and customizable structure for retrying tasks that can be unsuccessful or raise exceptions owing to transient problems like network malfunctions, timeouts, or interruptions in service. Tenacity makes the development of retry logic simpler with its user-friendly API and extensive feature set, freeing developers to concentrate on creating reliable systems rather than worrying about fleeting failures.

In this post, we'll go over the advantages of integrating the Tenacity library with IronPDF, present practical examples, and offer advice on how to create dependable PDF-generating processes in Python applications. Developers may improve the robustness and dependability of their apps while providing consumers with high-quality PDF documents by combining the power of Tenacity with IronPDF.

Decorator-based Retry

Tenacity enables programmers to use Python decorators to add retry logic to functions or methods. Because of this, adding retry behavior to particular actions without changing the original code is simple.

Tailorable Retry Plans

Tenacity offers several adjustable parameters to specify retry plans. The maximum number of retries, the interval between retries, and the circumstances in which retries should take place are all customizable by developers.

Exponential Backoff

Tenacity is in favor of exponential backoff, a popular current retry invocation technique in which the interval between retries grows exponentially with the number of attempts on each try. By doing this, you can avoid flooding the target service with requests when there is a lot of traffic or congestion.

Jitter and Randomness

Tenacity provides options for introducing jitter and randomness to retry delays in order to prevent synchronization problems and thundering herd issues. This lessens the possibility of several clients retrying at once by spreading out retry efforts across time.

Retry Conditions and Exceptions

Depending on the operation's return value or any raised exceptions, developers can create unique retry conditions. This makes it possible to regulate precisely when and under what conditions retries should be made.

Timeouts and Deadlines

Tenacity facilitates the creation of general operation timeouts and deadlines, guaranteeing that attempts at retrying are not made indefinitely and that operations are ultimately terminated if they take longer than predetermined thresholds.

Flask, Django, and Celery are just a few of the frameworks that Tenacity easily interacts with. This makes it simple for developers to add retry logic to background operations, web endpoints, or any other part of their systems.

Create and Configure Tenacity

Exponential Backoff

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

Random Jitter

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

Customizing Retry Conditions

Exceptions Customize Retrying

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

Retry Based on Return Value

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

Stop Conditions

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

Retry Callbacks

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

Getting Started

What is IronPDF?

We can create, edit, and render PDF documents inside of programs with the help of the popular toolkit IronPDF. Work with PDFs in a variety of ways: you can convert HTML pages to PDFs, add text, images, and shapes to ones that already exist, and extract text and images from ones that already exist. Even from HTML content, images, or raw data, you can create new PDF pages.

IronPDF is incredibly easy to use, which is one of its main advantages. Python's user-friendly API and extensive documentation make it simple for developers to begin creating PDFs from within their projects. IronPDF also has two more features: speed and efficiency, which let developers create high-quality PDF documents quickly.

A few benefits of IronPDF:

  • Transforming images, raw data, and HTML into PDFs.
  • Removing images and text from PDF files.
  • Adding headers, footers, and watermarks to PDF files.
  • Protecting PDF files with passwords and encryption.
  • The capacity to electronically sign and complete forms.

Install Libraries

Installing the required dependencies and integrating both libraries into your PDF-generating workflow are the first steps in using Tenacity and IronPDF together in a Python application.

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

In your Python script, import the required modules from Tenacity and 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

Call your function for creating PDFs and pass it the HTML text. Tenacity will automatically retry the function in accordance with the preset retry parameters if an exception occurs.

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

By modifying factors like the number of retries, the retry condition and wait condition, the interval between retries, and the circumstances under which retries should happen, you can further alter the retry behavior. Tenacity includes different retry methods and retry and wait condition strategies that you can use to fine-tune the retry behavior according to your requirements.

Sample Output

Below is the output generated from the above code:

Tenacity Python (How It Works For Developers): Figure 1 - Expected returned result retry PDF output

Conclusion

In summary, Tenacity and IronPDF together provide a potent solution for creating robust and dependable PDF-generating workflows in Python applications. Developers may make sure that their PDF generation processes are robust and resilient to temporary failures and retries by utilizing IronPDF's powerful PDF generation capabilities and Tenacity's customizable retry logic.

With Tenacity's extensive feature set, developers may precisely adjust retry tactics for multiple conditions, specify unique retry criteria, customize retries on exceptions, and include sophisticated configuration options. Tenacity allows developers to gracefully handle momentary failures, such as network outages or service interruptions, and guarantees that crucial PDF creation processes are immediately retried.

In conclusion, developers can create reliable and robust PDF production solutions that can handle the rigors of real-world settings by utilizing Tenacity with IronPDF. This combination offers a strong basis for creating dependable and scalable PDF generation workflows in Python applications, regardless of whether the workflow is for producing invoices, reports, or documents.

A lifetime license for IronPDF is included in the package for a reasonable fee. For many systems, the package is available for a very affordable $749. License holders get 24-hour access to online engineering support. Kindly visit the licensing page to obtain additional details on the charge. To find out more about Iron Software's products, go to the library page.

Chaknith Bin
Software Engineer
Chaknith works on IronXL and IronBarcode. He has deep expertise in C# and .NET, helping improve the software and support customers. His insights from user interactions contribute to better products, documentation, and overall experience.
Talk to an Expert Five Star Trust Score Rating

Ready to Get Started?