Utilizamos el Apio con nuestro Django webapp para gestionar tareas fuera de línea; algunas de estas tareas se pueden ejecutar hasta 120 segundos.
Cada vez que hacemos algún modificaciones del código, es necesario reiniciar el Apio tener que cargar el nuevo código de Python. Nuestra solución actual es enviar un SIGTERM a los principales Apio proceso (kill -s 15 `cat /var/run/celeryd.pid`
), luego a esperar a que se muera y se reinicia (python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
).
Debido a la larga duración de las tareas, esto generalmente significa que el cierre se tomará un minuto o dos, durante el cual no hay nuevas tareas se procesan, causando un retraso notable a los usuarios que actualmente en el sitio. Estoy buscando una manera de decirle a Apio para el cierre, pero inmediatamente el lanzamiento de una nueva Apio instancia para iniciar la ejecución de las nuevas tareas.
Cosas que no funcionan:
- El envío de SIGHUP al proceso principal: esto causó Apio para intentar reiniciar"," haciendo un cálido de apagado y, a continuación, el relanzamiento de sí mismo. Esto no sólo tomar un largo tiempo, que ni siquiera funciona, porque al parecer el nuevo proceso se inicia antes de que el viejo muere, por lo que el nuevo uno se queja
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
y muere inmediatamente. (Esto se parece a un error en el Apio en sí; he de hacerles saber acerca de ella). - El envío de SIGTERM al proceso principal y, a continuación, inmediatamente el lanzamiento de una nueva instancia: el mismo problema con el archivo pid.
- Desactivación de la Pidfile completo: sin ella, no tenemos ninguna manera de decir que de los 30 Apio proceso son el principal proceso que debe enviarse un SIGTERM cuando queremos hacer una cordial apagado. También disponemos de ninguna forma confiable para comprobar si el proceso principal todavía está vivo.