introducción a celery y las colas de tareas asíncronas
DESCRIPTION
Introducción al framework Celery y a las colas de tareas asíncronas en Python. Código fuente de los ejemplos disponible aquí: https://github.com/albertoalcolea/charla-celeryTRANSCRIPT
![Page 1: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/1.jpg)
CeleryDistributed Task Queue
Introducción a Celery y las colas de tareas asíncronas
Alberto AlcoleaAlberto Alcolea
@albertoalcoleahttp://albertoalcolea.com
![Page 2: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/2.jpg)
CeleryDistributed Task Queue
Recursos disponibles online
Presentación: http://slideshare.com/albertoalcolea/celery
Código fuente: https://github.com/albertoalcolea/charla-celery
![Page 3: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/3.jpg)
¿Qué es Celery?
![Page 4: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/4.jpg)
¡Escalar!
![Page 5: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/5.jpg)
Advanced Message Queuing Protocol
● Protocolo de capa de aplicaciones (OSI)● Orientado a mensajes● Encolamiento de mensajes: queuing● Enrutamiento:
– Punto-a-punto– Publicación-subscripción
![Page 6: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/6.jpg)
Casos de uso
● Tareas con alto costo computacional● I/O● Tareas periodicas: cron● Tareas lentas enviando los resultados con AJAX
![Page 7: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/7.jpg)
¡Cualquier cosa fuera del ciclo petición-respuesta!
![Page 8: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/8.jpg)
Arquitectura
user AMQPbroker
celeryworkers
backend
![Page 9: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/9.jpg)
Arquitectura
user
Envía a la cola:
Tareas individuales
Conjuntos de tareas
Tareas encadenadas
Tareas periódicas
Tareas “reintentables”
![Page 10: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/10.jpg)
Arquitectura
AMQPbroker
celeryworkers
Workers escuchan (o se
subscriben) al bus AMQP en
busca de nuevas tareas
![Page 11: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/11.jpg)
Arquitectura
AMQPbroker
celeryworkers
Workers ejecutan tareas en
paralelo.
Prefork (multiprocessing)
Eventlet, gevent
Threads
![Page 12: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/12.jpg)
Arquitectura
celeryworkers
backend
Resultados escritos en
un backend
RDBMS
Redis
memcached
MongoDB
![Page 13: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/13.jpg)
Arquitectura
celeryworkers
backend
Resultados escritos en
un backend
¡O no!
![Page 14: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/14.jpg)
Arquitectura
user backend
Lee los resultados
![Page 15: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/15.jpg)
Brokers soportados (v3.1)
Nombre Estado Monitorización Control remoto
RabbitMQ Estable Sí Sí
Redis Estable Sí Sí
MongoDB Experimental Sí Sí
Beanstalk Experimental No No
Amazon SQS Experimental No No
CouchDB Experimental No No
Zookeeper Experimental No No
Django ORM Experimental No No
SQLAlchemy Experimental No No
IronMQ Plugin de terceros No No
![Page 16: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/16.jpg)
![Page 17: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/17.jpg)
Celery messaging at scale at Instagram
http://lc0.github.io/blog/2013/05/01/celery-messaging-at-scale-at-instagram/
https://blogs.vmware.com/vfabric/2013/04/how-instagram-feeds-work-celery-and-rabbitmq.html
http://highscalability.com/blog/2012/4/9/the-instagram-architecture-facebook-bought-for-a-cool-billio.html
![Page 18: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/18.jpg)
Un poco de código
from celery import Celery
app = Celery('tasks', broker='amqp://')
@app.taskdef add(x, y): return x + y
![Page 19: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/19.jpg)
Un poco de código
from celery import Celery
app = Celery('tasks', broker='redis://')
@app.taskdef add(x, y): return x + y
![Page 20: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/20.jpg)
Un poco de código
from tasks import addadd.delay(4, 4)
![Page 21: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/21.jpg)
Un poco de código
from celery import Celery
app = Celery('tasks', broker='amqp://', backend='redis://')
@app.taskdef add(x, y): return x + y
@app.taskdef xsum(numbers): return sum(numbers)
![Page 22: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/22.jpg)
Un poco de código
from tasks import addresult = add.delay(4, 4)
results.ready() # True/False
results.get() # results.get(timeout=1)
result.traceback
![Page 23: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/23.jpg)
Un poco de código
@app.taskdef tarea_costosa(x, y):
try:do_something()
except Exception, exc:raise tarea_costosa.retry(exc=exc)
Si un nodo falla podemos reenviar la tarea a la cola.
![Page 24: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/24.jpg)
Canvas
Signatures (subtasks) Tareas llamadas dentro de otras tareas.● Definir tareas parciales
● Callbacks
● Tareas inmutables
partial = add.s(2) # incomplete signaturepartial.delay(4) # 2 + 4
add.apply_async((2, 2), link=add.s(8))
![Page 25: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/25.jpg)
Primitivas
Group Lista de tareas que deben ser aplicadas en paralelo.
ChainTareas que se ejecutan una detrás de otra (callbacks).
from celery import groupres = group(add.s(i, i) for i in xrange(10))()res.get(timeout=1)# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
from celery import chainres = chain(add.s(2, 2), add.s(4), add.s(8))()res.get() # 16(add.s(2, 2) | add.s(4) | add.s(8))().get()
![Page 26: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/26.jpg)
Primitivas
Chord Group con callback. Se ejecuta cuando todas terminan
ChunksDivide lista de argumentos y ejecuta en paralelo
from celery import chordres = chord((add.s(i, i) for i in xrange(10)), xsum.s())()res.get() # 90
from celery import chunksres = add.chunks(zip(range(100), range(100)), 10)()res.get()
![Page 27: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/27.jpg)
Primitivas
Chunks + Chord/Chain = map-reduce
@app.taskdef map(x, y):
return x + y
@app.taskdef reduce(numlist):
numbers = [item for sub in numlist for item in sub]return sum(numbers)
>>> chain(add.chunks(items, 5).group(), reduce.s())().get()9900>>> chord(add.chunks(items, 2).group(), reduce.s())().get()9900
![Page 28: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/28.jpg)
Canvas
¡Y más!
http://docs.celeryproject.org/en/latest/userguide/canvas.html
![Page 29: Introducción a Celery y las colas de tareas asíncronas](https://reader034.vdocuments.co/reader034/viewer/2022052410/54965794ac7959ff2d8b50b6/html5/thumbnails/29.jpg)
CeleryDistributed Task Queue
¡Gracias!
Alberto AlcoleaAlberto Alcolea
@albertoalcoleahttp://albertoalcolea.com