La hora Celery!

TL;DR Vamos a aprender que es celery y cuando/porque seria una buena idea utilizarlo para cualquier proyecto, incluyendo proyectos con Django

Celery!!! ¿Que es?

Celery es un sistema de tareas encoladas que se ejecutan de manera asincrona que trabaja a través de un sistema de publicacion/subscripción de manera que podamos cambiar cualquier componente de manera sencilla.

Para poder entender que componentes se pueden cambiar es importante conocer cuales son las partes integrales de Celery, estas son Workers, Broker de mensajes y Aplicación.

¿Que es un Broker?

Un broker es un sistema que maneja el envio, encolamiento y recepción de mensajes, a través del cual podemos comunicar diferentes sistemas, uno de los protocolos mas utilizados para este envio de sistemas es el protocolo AMQP que utilizan aplicaciones conocidas como rabbitmq, redis y Amazon MQ.

¿Que es un Worker?

Un worker es un hilo que se subscribe a una “cola” de trabajo de un Broker y que esta continuamente consultando si han llegado nuevos mensajes a dicha cola, de manera que una vez exista uno y el worker se encuentre disponible, ejecutará una tarea segun sea necesario. Un worker puede realizar mas de una actividad o especializarse en una en especifico segun la configuración que se le de al mismo.

¿Que es un una App de Celery?

Por ultimo, una app de celery (o instancia) es un controlador que realiza el trabajo de controlar como el Broker es informado de las tareas, como se enrutan (caso de utilizarse manualmente las rutas por celery) y de que forma se serializan los mensajes que se envian al mismo. Y por otra parte, celery también controla como cada uno de los Workers son levantados y como ellos se subscriben a las colas del Broker, de manera que puedan consumir los mensajes publicados.

celery

Mucha información manos a la obra, hagamos código 😀

Primero veamos que necesitamos instalar en nuestro computador, primero instalaremos rabbitmq para que trabaje como nuestro broker (es con el que estoy mas familiarizado), podemos buscar el instalador para cada Sistema operativo aquí. por mi parte la instalación en Mac OS podemos hacerlo a través de Brew, que es un manejador de paquetes para Mac, así como apt lo es para ubuntu/debian.

Luiss-MacBook-Pro:~ minrock$ brew install rabbitmq

Listo! una vez instalado rabbit, vamos a instalar celery (sería bueno instalarlo dentro de un virtualenv) a través de pip.

Luiss-MacBook-Pro:~ minrock$ pip install celery

Una vez instalado podrémos crear nuestra configuración inicial de la instancia de celery

from celery import Celery

app = Celery('tasks', broker="amqp://localhost")

@app.task(bind=True)
def test_task(self):
        return self.request

Para probar la creación de la instancia de celery vamos a crear un archivo main para lanzar una test_task, y eso lo haremos con el nombre de la tarea y el metodo .delay

from tasks import test_task

if __name__ == "__main__":
	test_task.delay()

Por ultimo lanzamos celery con el comando

Luiss-MacBook-Pro:~ minrock$ celery worker -A tasks -l INFO

Veremos una pantalla como esta:

Screen Shot 2018-03-19 at 9.24.30 PM

Y al lanzar nuestro archivo main.py, este enviara una tarea a nuestro celery y veremos algo como lo siguiente:

Screen Shot 2018-03-19 at 9.25.59 PM.png

Esta es la salida de nuestra task de ejemplo, así podemos comenzar a crear nuestras tareas y lanzar nuestro worker que las consuma.

Una task basica es una funcion que es decorada con @app.task, con esto podemos registrar cada una de las tasks que Celery reconocerá y expondrá en rabbit y en nuestro worker, en el decorador que utilizamos vemos un parametro llamado bind, lo que realmente pasa con este decorador, es que Celery toma el decorador y lo enlaza dentro de una clase, por ello al usar el parametro bind como true, el pasa el parametro self a la funcion para poder revisar cual es la información de la task que fue lanzada.

Por ultimo para enviar una task utilizamos la funcion .delay y pasamos por parametro cada uno de los parametros que recibirá la función decorada.

Así podemos concluir nuestro primer post de configuración de Celery y entender como este funciona. Espero les sirva mucho este post y nos vemos en el próximo.

Hasta luego! 🙂