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.
¿Qué debería pasar con las tareas de larga ejecución? Me gusta de esta manera: las tareas de larga ejecución deberían hacer su trabajo. No los interrumpa, solo las nuevas tareas deberían obtener el nuevo código.
Pero esto no es posible en este momento: https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ
Deberías mirar la autoreloading de autoreloading
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.
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
http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker