web-dev-qa-db-fra.com

Suppression de toutes les tâches en attente dans céleri / rabbitmq

Comment puis-je supprimer toutes les tâches en attente sans connaître le task_id de chaque tâche?

170
nabizan

De la docs :

$ celery -A proj purge

ou

from proj.celery import app
app.control.purge()

(EDIT: mis à jour avec la méthode actuelle.)

255
Philip Southam

Pour le céleri 3.0+:

$ celery purge

Pour purger une file d'attente spécifique:

$ celery -Q queue_name purge
114
ToonAlfrink

Pour le céleri 2.x et 3.x:

Lorsque vous utilisez worker avec le paramètre -Q pour définir les files d'attente, par exemple

celery worker -Q queue1,queue2,queue3

alors celery purge ne fonctionnera pas, car vous ne pouvez pas lui transmettre les paramètres de la file d'attente. Il ne supprimera que la file d'attente par défaut. La solution consiste à démarrer vos travailleurs avec le paramètre --purge comme ceci:

celery worker -Q queue1,queue2,queue3 --purge

Ce sera toutefois exécuter le travailleur.

Une autre option consiste à utiliser la sous-commande amqp de céleri

celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3
23
smido

Dans le céleri 3+:

CLI:

$ celery -A proj purge

Par programme:

>>> from proj.celery import app
>>> app.control.purge()

http://docs.celeryproject.org/en/latest/faq.html#how-do-i-purge-all-waiting-tasks

10
ksindi

J'ai trouvé que celery purge ne fonctionne pas pour ma configuration de céleri plus complexe. J'utilise plusieurs files d'attente nommées à différentes fins:

$ Sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ...  # Output sorted, whitespaced for readability
celery                                          0   2
[email protected]                      0   1
[email protected]                      0   1
apns                                            0   1
[email protected]                        0   1
analytics                                       1   1
[email protected]                   0   1
bcast.361093f1-de68-46c5-adff-d49ea8f164c0      0   1
bcast.a53632b0-c8b8-46d9-bd59-364afe9998c1      0   1
celeryev.c27b070d-b07e-4e37-9dca-dbb45d03fd54   0   1
celeryev.c66a9bed-84bd-40b0-8fe7-4e4d0c002866   0   1
celeryev.b490f71a-be1a-4cd8-ae17-06a713cc2a99   0   1
celeryev.9d023165-ab4a-42cb-86f8-90294b80bd1e   0   1

La première colonne est le nom de la file d'attente, la seconde le nombre de messages en attente dans la file d'attente et la troisième le nombre d'écouteurs de cette file d'attente. Les files d'attente sont:

  • céleri - File d'attente pour les tâches de céleri standard et idempotentes
  • apns - File d'attente pour les tâches Apple Push Notification Service, pas aussi idempotentes
  • analytics - File d'attente pour les analyses nocturnes de longue durée
  • * .pidbox - File d'attente pour les commandes de travail, telles que l'arrêt et la réinitialisation, une par travailleur (2 travailleurs de céleri, un travailleur d'ARN, un travailleur d'analyse)
  • bcast. * - Files d'attente de diffusion, pour l'envoi de messages à tous les travailleurs écoutant une file d'attente (plutôt que le premier à la récupérer)
  • celeryev. * - Files d'attente d'événements de céleri, pour la création de rapports d'analyse de tâches

La tâche d'analyse est une tâche de force brute qui a bien fonctionné sur de petits ensembles de données, mais qui prend maintenant plus de 24 heures à traiter. Parfois, quelque chose va mal tourner et cela va rester bloqué dans la base de données. Il doit être ré-écrit, mais jusque-là, quand il est bloqué, je tue la tâche, vide la file d'attente et réessaie. Je détecte le "blocage" en consultant le nombre de messages de la file d'attente d'analyse, qui doit être 0 (analyse terminée) ou 1 (en attente de la fin de l'analyse de la nuit dernière). 2 ou plus est mauvais, et je reçois un email.

celery purge propose d'effacer des tâches de l'une des files d'attente de diffusion et je ne vois pas l'option de choisir une autre file d'attente nommée.

Voici mon processus:

$ Sudo /etc/init.d/celeryd stop  # Wait for analytics task to be last one, Ctrl-C
$ ps -ef | grep analytics  # Get the PID of the worker, not the root PID reported by celery
$ Sudo kill <PID>
$ Sudo /etc/init.d/celeryd stop  # Confim dead
$ python manage.py celery amqp queue.purge analytics
$ Sudo rabbitmqctl list_queues -p celery name messages consumers  # Confirm messages is 0
$ Sudo /etc/init.d/celeryd start
9
jwhitlock

Dans le céleri 3+

http://docs.celeryproject.org/en/3.1/faq.html#how-do-i-purge-all-waiting-tasks

CLI

Purger la file nommée:

 celery -A proj amqp queue.purge <queue name>

Purger la file d'attente configurée

celery -A proj purge

J'ai purgé des messages, mais il reste encore des messages dans la file d'attente? Réponse: Les tâches sont acquittées (retirées de la file d'attente) dès qu'elles sont réellement exécutées. Une fois que le travailleur a reçu une tâche, son exécution prend un certain temps, en particulier si de nombreuses tâches sont déjà en attente d'exécution. Les messages non acquittés sont conservés par le travailleur jusqu'à la fermeture de la connexion au courtier (serveur AMQP). Lorsque cette connexion est fermée (p. Ex. Parce que le travailleur a été arrêté), les tâches sont renvoyées par le courtier au prochain travailleur disponible (ou au même travailleur après le redémarrage), afin de purger correctement la file d'attente des tâches en attente. doivent arrêter tous les travailleurs, puis purger les tâches à l’aide de celery.control.purge ().

Donc, pour purger toute la file d'attente, les travailleurs doivent être arrêtés.

5
oneklc

1. Pour purger correctement la file d'attente des tâches en attente, vous devez arrêter tous les travailleurs ( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged -messages-mais-il-y-est-encore-des-messages-laissés dans la file d'attente ):

$ Sudo rabbitmqctl stop

ou (si RabbitMQ/message broker est géré par le superviseur):

$ Sudo supervisorctl stop all

2. ... puis purgez les tâches d'une file d'attente spécifique:

$ cd <source_dir>
$ celery amqp queue.purge <queue name>

3. Lancez RabbitMQ:

$ Sudo rabbitmqctl start

ou (si RabbitMQ est géré par le superviseur):

$ Sudo supervisorctl start all
2
Ukr

céleri 4 + commande de purge du céleri pour purger toutes les files d'attente de tâches configurées

celery -A *APPNAME* purge

par programme:

from proj.celery import app
app.control.purge()

toute tâche en attente sera purgée. Référence: celerydoc

2
Roshan Bagdiya