Estoy probando el apio en un entorno local. Mi archivo Python tiene las siguientes dos líneas de código:

celery_app.send_task('tasks.test1', args=[self.id], kwargs={})
celery_app.send_task('tasks.test2', args=[self.id], kwargs={})

Mirando la salida de la consola, parecen ejecutarse uno tras otro en secuencia. Pero test2 solo se ejecuta después de que test1 haya terminado. Al menos esta es la forma en que parece leer la salida de la consola.

Estas tareas no tienen dependencias entre sí , por lo que no quiero que una tarea espere a que se complete otra antes de pasar a la siguiente línea.

¿Cómo puedo ejecutar ambas tareas al mismo tiempo?

---- **** -----
--- * ***  * -- Darwin-14.0.0-x86_64-i386-64bit
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x104cd8c10
- ** ---------- .> transport:   sqs://123
- ** ---------- .> results:     disabled
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery
7
Prometheus 29 ago. 2014 a las 18:57

2 respuestas

La mejor respuesta

Hay múltiples formas de lograr esto.

1. Trabajador único: cola única.

$ celery -A my_app worker -l info  -c 2 -n my_worker

Esto iniciará un trabajador que ejecuta 2 tareas al mismo tiempo.

2. Trabajadores múltiples: cola única.

$ celery -A my_app worker -l info  -c 1 -n my_worker1
$ celery -A my_app worker -l info  -c 1 -n my_worker2

Esto iniciará dos trabajadores que ejecutan una tarea a la vez. Tenga en cuenta que ambas tareas están en la misma cola.

3. Múltiples trabajadores: Múltiples colas.

$ celery -A my_app worker -l info  -c 1 -n my_worker1 -Q queue1
$ celery -A my_app worker -l info  -c 1 -n my_worker2 -Q queue2

Esto iniciará dos trabajadores que ejecutan una tarea a la vez. Pero aquí tienes la ruta de las tareas en consecuencia.

celery_app.send_task('tasks.test1', args=[self.id], kwargs={}, queue='queue1')
celery_app.send_task('tasks.test2', args=[self.id], kwargs={}, queue='queue2')

4. Trabajador individual: todas las colas

$ celery -A my_app worker -l info -n my_worker1 

Si no menciona ninguna cola, se consumirá de todas las colas de forma predeterminada.

18
ChillarAnand 27 feb. 2020 a las 13:18

Llame al trabajador con la opción --autoscale que aumentaría y reduciría los procesos según sea necesario.

--autoscale AUTOSCALE
                       Enable autoscaling by providing max_concurrency,
                       min_concurrency. Example:: --autoscale=10,3 (always
                       keep 3 processes, but grow to 10 if necessary)

Ejemplo.

celery -A sandbox worker --autoscale=10,0 --loglevel=info 
3
All Іѕ Vаиітy 27 oct. 2017 a las 17:42