24 votos

Cómo reiniciar el Apio con gracia, sin retrasar las tareas

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.

4voto

0x00mh Puntos 2696

celeryd ha --autoreload opción. Si está habilitado, el apio trabajador (proceso principal) detectar cambios en el apio módulos y reiniciar todos los procesos de trabajo. En contraste con la señal SIGHUP, autoreload se reinicia cada proceso de forma independiente cuando la corriente de la ejecución de la tarea acabados. Esto significa que mientras un proceso de trabajo que se está reiniciando el resto de los procesos se pueden ejecutar las tareas.

http://celery.readthedocs.org/en/latest/userguide/workers.html#autoreloading

3voto

Ivan Virabyan Puntos 737

Recientemente he corregido el error con SIGHUP: https://github.com/celery/celery/pull/662

2voto

Régis B. Puntos 1188
rm *.pyc

Esto hace que las tareas actualizadas para ser recargado. Descubrí este truco recientemente, sólo espero que no existen efectos secundarios desagradables.

0voto

j_mcnally Puntos 4023

Puede iniciar con una costumbre pid nombre de archivo. Posiblemente de sellos de tiempo, y la clave de que saber que el PID a matar?

CELERYD_PID_FILE="/var/run/celery/%n_{timestamp}.pid"

^No sé la marca de tiempo de la sintaxis, pero tal vez usted o usted lo puede encontrar?

a continuación, utilice el sistema de la corriente de tiempo para matar cualquier edad pids y el lanzamiento de una nueva?

0voto

Debanshu Kundu Puntos 354

Así que el uso de SIGHUP (1) para el calentamiento de cierre de apio. No estoy seguro de si en realidad provoca un calentamiento de apagado. Pero SIGINT (2) podría causar un calentamiento apagado. Trate de SIGINT en lugar de SIGHUP y, a continuación, iniciar el apio manualmente en su guión (supongo).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X