python - que - programacion colas
¿Cómo mantener múltiples colas de apio independientes? (2)
Para enlazar a una cola diferente dinámicamente, siga los pasos a continuación:
1) Especifique el nombre de la cola con el atributo ''queue''
celery.send_task(''job1'', args=[], kwargs={}, queue=''queue_name_1'')
celery.send_task(''job1'', args=[], kwargs={}, queue=''queue_name_2'')
(Aquí un trabajo particular usa dos colas)
2) Agregue la siguiente entrada en el archivo de configuración
CELERY_CREATE_MISSING_QUEUES = True
3) Al iniciar el trabajador, use -Q para especificar el nombre de la cola ''desde donde se consumirán los trabajos
celery -A proj worker -l info -Q queue1
celery -A proj worker -l info -Q queue2
Estoy tratando de mantener varias colas de apio con diferentes tareas y trabajadores en la misma base de datos de redis. Realmente solo es un problema de conveniencia de solo querer un servidor redis en lugar de dos en mi máquina.
Seguí los tutoriales de apio de forma literal, ya que es la única forma de hacerlo funcionar para mí. Ahora, cuando trato de duplicar todo con nombres / colas ligeramente modificados, sigue fallando.
Nota: soy nuevo en Python y Celery, que obviamente es parte del problema. No estoy seguro de qué partes se denominan "tarea / tareas" como nombre frente a palabras especiales.
Mi versión condensada de documentos: Ejecutar celery -A tasks worker
para generar los trabajadores. tasks.py contiene código de tarea con celery = Celery(''tasks'', broker=''redis://localhost'')
para conectarse a Apio y @task()
encima de mis funciones que quiero retrasar.
Dentro de mi programa para tareas de colas ...
from tasks import do_work
do_work.delay()
Entonces, dado todo lo anterior, ¿cuáles son los pasos que debo seguir para convertir esto en dos tipos de tareas que se ejecutan de forma independiente en colas y trabajadores separados? Por ejemplo, blue_tasks y red_tasks?
He intentado cambiar todas las instancias de tareas a blue_tasks o red_tasks. Sin embargo, cuando hago cola en blue_tasks, los trabajadores de red_tasks que he empezado comienzan a tratar de trabajar en ellos.
Leí sobre las colas predeterminadas y demás, así que probé este código, que no funcionó:
CELERY_DEFAULT_QUEUE = ''red''
CELERY_QUEUES = (
Queue(''red'', Exchange(''red''), routing_key=''red''),
)
Como nota al margen, no entiendo por qué el celery worker
falla con el apio al intentar conectarse a una instancia de amqp predeterminada, mientras que el celery -A tasks worker
le dice al apio que se conecte a Redis. ¿Qué código de tarea es el celery worker
intenta ejecutar en el trabajador si no se ha especificado nada?
Por defecto, todo entra en una cola predeterminada llamada celery
(y esto es lo que procesará el celery worker
si no se especifica una cola)
Entonces, digamos que tiene su función de tarea django_project_root/myapp/tasks.py
en django_project_root/myapp/tasks.py
.
Puede configurar la tarea do_work
para que viva en su propia cola así:
CELERY_ROUTES = {
''myproject.tasks.do_work'': {''queue'': ''red''},
}
Luego, ejecute un trabajador usando celery worker -Q red
y solo procesará las cosas en esa cola (otro trabajador invocado con celery worker
solo recogerá las cosas en la cola predeterminada)
La sección de enrutamiento de tareas en la documentación debe explicar todo.