¿Cómo mantener múltiples colas de apio independientes?

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 textualmente, 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 “tareas / 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 progtwig 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 .

Podría 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.

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