django - migrations - Cómo reiniciar el apio con gracia sin retrasar las tareas
no migrations to apply (7)
¿Se puede iniciar con un nombre de archivo pid personalizado. ¿Posiblemente con marca de tiempo y clave para saber qué PID matar?
CELERYD_PID_FILE="/var/run/celery/%n_{timestamp}.pid"
^ No conozco la sintaxis de la marca de hora, pero tal vez sí o puede encontrarla.
¿Luego usa la hora actual del sistema para eliminar los pids antiguos y lanzar uno nuevo?
Usamos Celery con nuestra aplicación web Django para administrar las tareas fuera de línea; Algunas de estas tareas pueden ejecutar hasta 120 segundos.
Siempre que realicemos modificaciones al código, debemos reiniciar Celery para que vuelva a cargar el nuevo código de Python. Nuestra solución actual es enviar un SIGTERM al proceso principal de apio ( kill -s 15 `cat /var/run/celeryd.pid`
), luego esperar a que muera y reiniciarlo ( python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
).
Debido a las tareas de larga ejecución, esto generalmente significa que el apagado demorará un minuto o dos, durante el cual no se procesan nuevas tareas, lo que causa un retraso notable en los usuarios que se encuentran actualmente en el sitio. Estoy buscando una manera de decirle a Celery que se apague, pero luego lanzar inmediatamente una nueva instancia de Celery para comenzar a ejecutar nuevas tareas.
Cosas que no funcionaron:
- Enviar SIGHUP al proceso principal: esto provocó que Celery intentara "reiniciar" haciendo un cierre cálido y luego reiniciando. Esto no solo lleva mucho tiempo, ni siquiera funciona, porque aparentemente el nuevo proceso se inicia antes de que muera el anterior, por lo que el nuevo se queja
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we''re already running? (PID: 13214)
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we''re already running? (PID: 13214)
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we''re already running? (PID: 13214)
y muere inmediatamente. (Esto parece un error en el propio apio; les he hecho saber al respecto). - Enviar SIGTERM al proceso principal y luego lanzar inmediatamente una nueva instancia: el mismo problema con el Pidfile.
- Deshabilitar el archivo Pid completamente: sin él, no tenemos forma de saber cuál de los 30 procesos de apio es el proceso principal al que se debe enviar un SIGTERM cuando queremos que se cierre en caliente. Tampoco tenemos una manera confiable de verificar si el proceso principal aún está vivo.
Bueno, estás usando SIGHUP (1) para el cierre caliente del apio. No estoy seguro de si realmente causa un cierre cálido. Pero SIGINT (2) causaría un cierre cálido. Pruebe SIGINT en lugar de SIGHUP y luego inicie el apio manualmente en su script (supongo).
Creo que puedes probar esto:
kill -s HUP ``cat /var/run/celeryd.pid``
python manage.py celeryd --pidfile=/var/run/celeryd.pid
HUP
puede reciclar a todos los trabajadores libres y dejar que los trabajadores ejecutores sigan funcionando y HUP
permitirá que estos trabajadores sean de confianza. Entonces puede reiniciar con seguridad un nuevo proceso principal de trabajadores de apio y trabajadores. Los viejos trabajadores pueden ser asesinados cuando la tarea ha terminado.
Lo he usado de esta manera en nuestra producción y parece seguro ahora. ¡Espero que esto le pueda ayudar!
Recientemente he solucionado el error con SIGHUP: https://github.com/celery/celery/pull/662
Un poco tarde, pero eso se puede solucionar eliminando el archivo llamado celerybeat.pid .
Trabajó para mi
celeryd tiene --autoreload opción. Si está habilitado, apio worker (proceso principal) detectará cambios en los módulos de apio y reiniciará todos los procesos de trabajador. A diferencia de la señal SIGHUP, la carga automática reinicia cada proceso independientemente cuando finaliza la tarea en ejecución actual. Significa que mientras un proceso de trabajo está reiniciando, los procesos restantes pueden ejecutar tareas.
http://celery.readthedocs.org/en/latest/userguide/workers.html#autoreloading
rm *.pyc
Esto hace que las tareas actualizadas se vuelvan a cargar. Descubrí este truco recientemente, solo espero que no haya efectos secundarios desagradables.