with run how beat app django celery celeryd

django - run - ¿Cómo reinicio los trabajadores de apio con elegancia?



how to use celery with django (6)

Mientras se emite una nueva versión para actualizar el código en los trabajadores, ¿cómo reinicio los trabajos de apio con elegancia?

Editar: Lo que pretendo hacer es algo como esto.

  • Trabajador se está ejecutando, probablemente cargando un archivo de 100 MB en S3
  • Una nueva construcción viene
  • El código del trabajador tiene cambios
  • El script de compilación muestra una señal al Trabajador (es)
  • Inicia nuevos trabajadores con el nuevo código
  • Trabajador (s) que recibieron la señal después de terminar la salida de trabajo existente.



El nuevo método recomendado para reiniciar a un trabajador está documentado aquí http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker

$ celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid $ celery multi restart 1 --pidfile=/var/run/celery/%n.pid

De acuerdo con http://ask.github.com/celery/userguide/workers.html#restarting-the-worker puede reiniciar un trabajador que envía una señal HUP

ps auxww | grep celeryd | grep -v "grep" | awk ''{print $2}'' | xargs kill -HUP


He probado repetidamente la solución -HUP utilizando un script automatizado, pero encuentro que aproximadamente el 5% del tiempo, el trabajador deja de buscar nuevos trabajos después de reiniciarse.

Una solución más confiable es:

stop <celery_service>
start <celery_service>

que he usado cientos de veces ahora sin ningún problema.

Desde dentro de Python, puede ejecutar:

import subprocess service_name = ''celery_service'' for command in [''stop'', ''start'']: subprocess.check_call(command + '' '' + service_name, shell=True)


Si vas a la ruta de kill , pgrep al rescate:

kill -9 `pgrep -f celeryd`

Eso sí, esta no es una tarea larga y no me importa si termina brutalmente. Simplemente volviendo a cargar el nuevo código durante el desarrollo. Me gustaría ir a la ruta de servicio de reinicio si era más sensible.