Python: tarea asíncrona con RabbitMQ

¿Alguna vez se ha enfrentado a un problema en el que necesita realizar una tarea en segundo plano que llevará mucho tiempo completar? ¿Alguna vez has querido realizar una tarea después de un cierto intervalo de tiempo? Si su respuesta fue «SÍ» para cualquiera de las preguntas anteriores, entonces Python lo tiene cubierto. Estaremos demostrando cómo realizar tareas asincrónicas utilizando RabbitMQ .

¿Qué significa exactamente asincrónico ?
Asíncrono significa controlar la temporización de las operaciones a realizar mediante el uso de señales enviadas cuando se completa la operación anterior en lugar de a intervalos regulares.

¿Qué es RabbitMQ ?
RabbitMQ es un software de intermediario de mensajes que implementó originalmente el Protocolo avanzado de cola de mensajes (AMQP) y desde entonces se ha ampliado con una arquitectura de complemento para admitir el Protocolo de transmisión de mensajes orientados al texto (STOMP), Transporte de telemetría MQ (MQTT) y otros protocolos. . Si eso le pareció complicado, no se preocupe, lo tenemos cubierto. Entonces, en términos simples, proporciona una cola que realiza tareas en segundo plano ejecutando un servidor propio.

Con todo eso aclarado, comencemos con la instalación de RabbitMQ y otras herramientas necesarias. Entonces, usaremos un paquete de python llamado Celery para conectarnos con RabbitMQ. Celery proporciona una manera fácil de conectar y enviar tareas a la cola (RabbitMQ). Más técnicamente hablando, Celery es un sistema de cola de tareas de Python que maneja la distribución de tareas en los trabajadores a través de subprocesos o Nodes de red.

Debe tener Python instalado en su sistema. Entonces necesita instalar Celery en su sistema. Para hacerlo, simplemente escriba lo siguiente

pip install celery==4.4.2

A continuación, instale RabbitMQ en su máquina. Para hacerlo, dirígete a su página oficial y descarga el instalador según tu sistema operativo. Es posible que necesite descargar ErLang junto con RabbitMQ. Una vez instalado escriba lo siguiente en su terminal

rabbitmq-server restart

Deberías obtener una salida como esta

RabbitMQ terminal

No cierre este terminal. Ahora su corredor debería estar ejecutándose. Para verificar eso, vaya a http://localhost:15672/ en su navegador e ingrese el nombre de usuario y la contraseña. El nombre de usuario predeterminado es invitado y la contraseña predeterminada también es invitado . Debería ver algo como esto

RabbitMQ localhost

Ahora, comencemos con la parte divertida, también conocida como codificación.

Estaremos descargando un video de YouTube a nuestro sistema. Usaremos el módulo pytube para descargarlo. Para instalar pytube escriba lo siguiente

pip install pytube3

La descarga de videos de YouTube puede llevar mucho tiempo. Ahora veremos cómo nuestro archivo python se ejecuta instantáneamente y el video continúa descargándose en segundo plano.

Primero, crearemos un archivo python llamado task_queue.py

from celery import Celery
import sys
  
from pytube import YouTube
  
# Where the downloaded files will be stored
BASEDIR ="D:\\"
  
# Create the app and set the broker location (RabbitMQ)
app = Celery('downloader',
            backend ='rpc://',
            broker ='pyamqp://guest@localhost//')
  
@app.task
def download(url, filename):
    """
    Download a page and save it to the BASEDIR directory
      url: the url to download
      filename: the filename used to save the url in BASEDIR
    """
    try:
        # object creation using YouTube which
        # was imported in the beginning
        yt = YouTube(url)
    except:
        print("Connection Error") # to handle exception
  
    # filters out all the files with "mp4" extension
    yt.streams\
        .filter(progressive = True, file_extension ='mp4')\
        .order_by('resolution')[-1]\
        .download(output_path = BASEDIR, filename = filename) 
        # downloading the video
  
    print('Task Completed !')

Necesitamos otro archivo python para ejecutar este código (puede hacerlo en el mismo archivo, pero es una buena práctica llamar a la función desde otro archivo). Cree otro archivo con el nombre runtask.py

import sys
from task_queue import download
  
# gets the first command line argument
link = sys.argv[1]
  
# gets the second command line argument
filename = sys.argv[2]
  
# calling the download function
download.delay(link, filename)

Ahora, comience Apio. Para hacerlo, abra una terminal en su directorio de trabajo y escriba lo siguiente

celery -A task_queue worker --pool=solo -E

Si obtiene algún error en esto, entonces su servidor RabbitMQ no se está ejecutando o no está en su directorio de trabajo. Deberías obtener una salida como esta

Celery

Ahora tenemos Celery funcionando. ahora abra otra terminal en el mismo directorio y ejecute el siguiente comando

$ python runtask.py https://www.youtube.com/watch?v=vG2PNdI8axo Geeksforgeeks

Después de completar el comando anterior, espere unos segundos para permitir que la descarga finalice en segundo plano. Luego vaya a su unidad D: y allí verá un archivo llamado Geeksforgeeks.mp4 . Eso es todo. Tu vídeo está descargado.

Las tareas asincrónicas son muy esenciales en los casos de la vida real. No puede tener su software o sitio web atascado en una página de carga mientras su código realiza tareas. Las tareas que tardan más tiempo en ejecutarse se realizan en segundo plano sin detener el hilo principal.

Publicación traducida automáticamente

Artículo escrito por debdutgoswami y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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