Python ejecutar funciones de forma asíncrona y en background

2 minutos

Python

Disponemos de diversas librerías y sintaxis nativa en Python para ejecutar instrucciones de fondo, permitiendo continuar las acciones mientras por detrás se completan. De este modo evitaremos bloqueos del hilo principal o esperas innecesarias mientras esperamos una respuesta (un API, disco duro, calculo complejo…). Y entre todas las posibilidades voy a dejar un par de ejemplos de como usar threading.

¿Por qué deberíamos acostumbrarnos a usarla? Es un error clásico en el desarrollo web hacer esperar a un usuario antes de darle una respuesta. Pongamos de ejemplo un formulario de contacto: hasta que el email no se ha enviado no le decimos que todo ha ido bien, haciendo que espere sin sentido mientras conectamos con el servidor SMTP, generamos el cuerpo del correo, tal vez algún PDF, lo enviamos, almacenamos una copia en la base de datos, puede que algunas copias a los administradores, etc… ¿Por qué no dejar esa tarea en un hilo asíncrono en background? El visitante percibirá una respuesta casi instantánea de que todo ha ido bien, ganando fluidez cuando interactúe con la aplicación.

En el siguiente ejemplo lanzamos function_1 en background.

import threading

# Función que se ejecutará de forma asíncrona

def funcion_1(parametro_1):
    pass

# Declaro un hilo de ejecución. "args" debe ser una Tupla.

threading_emails = threading.Thread(target=funcion_1, args=(parametro_1,))

# Lo lanzo

threading_emails.start()

# Resto de mi código que se ejecutará de forma paralela
...


Veamos un ejemplo con código real.

import threading
import time

# Función que se ejecutará de forma asíncrona

def saluda(nombre):
    # Espera 2 segundos
    time.sleep(2)
    print(f"Hola {nombre}")

# Declaro un hilo de ejecución

threading_emails = threading.Thread(target=saluda, args=("Snake",))

# Lo lanzo

threading_emails.start()

# Resto de mi código que se ejecutará de forma paralela

print("Soy el resto del código")

Se imprimirá:

Soy el resto del código
Hola Snake

En el caso de necesitar de ejecutar muchas funciones asíncronas, podemos agruparlas en una sola.

import threading

# Funciones que quiero ejecutar de forma asíncrona

def funcion_1(parametro_1):
    pass

def funcion_2():
    pass

def funcion_3(parametro_2):
    pass

def funcion_4(parametro_1, parametro_2):
    pass

# Función que engloba a todas

def conjunto_de_funciones(parametro_1, parametro_2):
    funcion_1(parametro_1)
    funcion_2()
    funcion_3(parametro_2)
    funcion_4(parametro_1, parametro_2)

# Declaro un hilo de ejecución

threading_emails = threading.Thread(target=conjunto_de_funciones, args=(parametro_1, parametro_2))

# Lo lanzo

threading_emails.start()

# Resto de mi código que se ejecutará de forma paralela
...


Si necesitas ampliar estas herramientas puedes consultar la librería asyncio o directamente aprender a usar funciones async.

¡Ánimo!

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

Donación con recompensa

  • 1 café: Respondo a tu duda en los comentarios.
  • 2 cafés: Respondo en menos de 24h a tu comentario.
  • 3 cafés: Todo lo anterior y además te doy las gracias en mis redes.
Comprame un café

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...