Utilizziamo Celery con la nostra app web Django per gestire le attività offline; alcune di queste attività possono essere eseguite fino a 120 secondi.Come riavviare Celery senza ritardi delle attività
Ogni volta che apportiamo modifiche al codice, è necessario riavviare Celery per farlo ricaricare il nuovo codice Python. La nostra soluzione attuale è quella di inviare un SIGTERM al processo principale di Celery (kill -s 15 `cat /var/run/celeryd.pid`
), quindi attendere che muoia e riavviarlo (python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
).
A causa delle attività a esecuzione prolungata, questo di solito significa che lo spegnimento richiederà un minuto o due, durante il quale non vengono elaborate nuove attività, causando un ritardo evidente agli utenti attualmente sul sito. Sto cercando un modo per dire a Celery di spegnersi, ma poi lanciamo immediatamente una nuova istanza di Celery per iniziare a eseguire nuovi compiti.
Le cose non che ha fatto lavoro:
- Invio SIGHUP al processo principale: questo ha causato sedano per tentare di "restart", effettuando un arresto caldo e poi rilanciare se stessa. Non solo ci vuole molto tempo, non funziona nemmeno, perché apparentemente il nuovo processo si avvia prima che il vecchio muore, quindi il nuovo si lamenta
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
e muore immediatamente. (Questo sembra un bug in Celery stesso, ho let them know a riguardo.) - Invio di SIGTERM al processo principale e quindi avvio immediato di una nuova istanza: stesso problema con il file Pid.
- Disabilitare completamente il Pidfile: senza di esso, non abbiamo modo di dire quale dei 30 processi di Celery sia il processo principale che deve essere inviato a SIGTERM quando vogliamo che esegua un arresto caldo. Non abbiamo neanche un modo affidabile per verificare se il processo principale è ancora vivo.
Forse la mia risposta di http://stackoverflow.com/questions/9764913/how-do-i-restart-celery-workers-gracefully/16717128#16717128 ti aiuta. – guettli