J'utilise Celery (3.0.15) avec Redis comme courtier.
Existe-t-il un moyen simple d'interroger le nombre de tâches portant un nom donné qui existent dans une file d'attente Celery?
Et, à titre de suivi, existe-t-il un moyen d'annuler toutes les tâches portant un nom donné qui existent dans une file d'attente Celery?
J'ai parcouru le Guide de surveillance et de gestion et je n'y vois aucune solution.
# Retrieve tasks
# Reference: http://docs.celeryproject.org/en/latest/reference/celery.events.state.html
query = celery.events.state.tasks_by_type(your_task_name)
# Kill tasks
# Reference: http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks
for uuid, task in query:
celery.control.revoke(uuid, terminate=True)
Il y a un problème que les réponses antérieures n'ont pas abordé et qui peuvent déconcerter les gens s'ils ne le savent pas.
Parmi ces solutions déjà publiées, j'utiliserais de Danielle avec une modification mineure: j'importerais la tâche dans mon fichier et utiliserais son attribut .name
Pour obtenir le nom de la tâche à transmettre à .tasks_by_type()
.
app.control.revoke(
[uuid for uuid, _ in
celery.events.state.State().tasks_by_type(task.name)])
Cependant, cette solution ignorera les tâches qui ont été planifiées pour une exécution future. Comme certaines personnes qui ont commenté d'autres réponses, lorsque j'ai vérifié quelle fonction .tasks_by_type()
return J'avais une liste vide. Et en effet mes files d'attente étaient vides. Mais je savais que des tâches devaient être exécutées à l'avenir et celles-ci étaient ma cible principale. Je pouvais les voir en exécutant celery -A [app] inspect scheduled
Mais ils n'étaient pas affectés par le code ci-dessus.
J'ai réussi à révoquer les tâches planifiées en procédant comme suit:
app.control.revoke(
[scheduled["request"]["id"] for scheduled in
chain.from_iterable(app.control.inspect().scheduled()
.itervalues())])
app.control.inspect().scheduled()
renvoie un dictionnaire dont les clés sont des noms de travailleur et les valeurs sont listes d'informations de planification (d'où la nécessité de chain.from_iterable
qui est importé de itertools
). Les informations sur la tâche se trouvent dans le champ "request"
Des informations de planification et "id"
Contient l'ID de la tâche. Notez que même après la révocation, la tâche planifiée apparaîtra toujours parmi les tâches planifiées. Les tâches planifiées qui sont révoquées ne seront pas supprimées de la liste des tâches planifiées jusqu'à l'expiration de leur temporisation ou jusqu'à ce que Celery effectue une opération de nettoyage. (Le redémarrage des employés déclenche un tel nettoyage.)
Vous pouvez le faire en une seule demande:
app.control.revoke([
uuid
for uuid, _ in
celery.events.state.State().tasks_by_type(task_name)
])
Il semble que flower
assure la surveillance:
https://github.com/mher/flower
Surveillance en temps réel avec Celery Events
Progression et historique des tâches Possibilité d'afficher les détails de la tâche (arguments, heure de début, temps d'exécution, etc.) Graphiques et statistiques Télécommande
Afficher le statut et les statistiques du travailleur Arrêter et redémarrer les instances de travailleur Contrôler la taille du pool de travailleurs et les paramètres de mise à l'échelle automatique Afficher et modifier les files d'attente d'une instance de travailleur consommer Afficher les tâches en cours d'exécution Afficher les tâches planifiées (ETA/compte à rebours) Afficher les tâches réservées et révoquées Appliquer les limites de temps et de taux Configuration visualiseur Révoquer ou terminer des tâches API HTTP
Authentification OpenID