Lors de la publication d'une nouvelle version pour mettre à jour le code dans les travailleurs, comment redémarrer les travailleurs céleri avec élégance?
Edit: Ce que j'ai l'intention de faire, c'est quelque chose comme ça.
La nouvelle méthode recommandée pour redémarrer un travailleur est documentée ici http://docs.celryproject.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
Selon http://ask.github.com/celery/userguide/workers.html#restarting-the-worker vous pouvez redémarrer un travailleur envoyant un signal HUP
ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
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.celryproject.org/en/latest/userguide/workers.html#restarting-the-worker
Si vous suivez la route kill
, pgrep à la rescousse:
kill -9 `pgrep -f celeryd`
Attention, ce n'est pas une tâche de longue haleine et je m'en fiche si elle se termine brutalement. Recharger juste le nouveau code pendant le dev. J'irais la route du service de redémarrage si elle était plus sensible.
Vous devriez regarder Celery's autoreloading
J'ai testé à plusieurs reprises la solution -HUP à l'aide d'un script automatisé, mais je constate qu'environ 5% du temps, le travailleur cesse de prendre de nouveaux emplois après avoir été redémarré.
Une solution plus fiable est:
stop <celery_service>
start <celery_service>
que j'ai utilisé des centaines de fois sans aucun problème.
Depuis Python, vous pouvez exécuter:
import subprocess
service_name = 'celery_service'
for command in ['stop', 'start']:
subprocess.check_call(command + ' ' + service_name, Shell=True)
Tu peux faire:
celery multi restart w1 -A your_project -l info # restart workers entrez la description du lien ici
Que devrait-il arriver aux tâches de longue durée? Je l'aime comme ça: les tâches de longue durée devraient faire leur travail. Ne les interrompez pas, seules les nouvelles tâches devraient obtenir le nouveau code.
Mais ce n'est pas possible pour le moment: https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ