web-dev-qa-db-fra.com

Comment inspecter et annuler des tâches de céleri par nom de tâche

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.

31
Mzzzzzz
# 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)
31
gioi

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.)

13
Louis

Vous pouvez le faire en une seule demande:

app.control.revoke([
    uuid
    for uuid, _ in
    celery.events.state.State().tasks_by_type(task_name)
])
4
Danielle Madeley

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

1
dm03514