web-dev-qa-db-fra.com

Comment redémarrer les travailleurs céleri avec élégance?

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.

  • Le travailleur est en cours d'exécution, téléchargeant probablement un fichier de 100 Mo sur S3
  • Une nouvelle construction arrive
  • Le code du travailleur a changé
  • Le script de construction déclenche un signal au (x) travailleur (s)
  • Lance de nouveaux employés avec le nouveau code
  • Travailleur (s) ayant reçu le signal après avoir terminé la sortie d'emploi existante.
40
Quintin Par

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
45
armonge
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

11
zengr

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.

4
JL Peyret

Vous devriez regarder Celery's autoreloading

3
sebasmagri

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)
2
crunk_monad

Tu peux faire:

celery multi restart w1 -A your_project -l info # restart workers entrez la description du lien ici

1
cảnh nguyễn

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

1
guettli