55 votes

Découvrez si la tâche de céleri existe

Est-il possible de savoir si une tâche avec un certain identifiant de tâche existe ? Lorsque j'essaie d'obtenir le statut, je serai toujours en attente.

 >>> AsyncResult('...').status
'PENDING'

Je veux savoir si un identifiant de tâche donné est un véritable identifiant de tâche de céleri et non une chaîne aléatoire. Je veux des résultats différents selon qu'il existe une tâche valide pour un certain identifiant.

Il peut y avoir eu une tâche valide dans le passé avec le même identifiant, mais les résultats peuvent avoir été supprimés du backend.

40voto

asksol Points 9574

Le céleri n'écrit pas d'état lorsque la tâche est envoyée, c'est en partie une optimisation (voir http://docs.celeryproject.org/en/latest/userguide/tasks.html#state ).

Si vous en avez vraiment besoin, c'est simple d'ajouter :

 from celery import current_app
# `after_task_publish` is available in celery 3.1+
# for older versions use the deprecated `task_sent` signal
from celery.signals import after_task_publish

# when using celery versions older than 4.0, use body instead of headers

@after_task_publish.connect
def update_sent_state(sender=None, headers=None, **kwargs):
    # the task may not exist if sent using `send_task` which
    # sends tasks by name, so fall back to the default result backend
    # if that is the case.
    task = current_app.tasks.get(sender)
    backend = task.backend if task else current_app.backend

    backend.store_result(headers['id'], None, "SENT")

Ensuite, vous pouvez tester l'état PENDING pour détecter qu'une tâche n'a pas (apparemment) a été envoyé:

 >>> result.state != "PENDING"

3voto

Nikolay Fominyh Points 2739

En ce moment, j'utilise le schéma suivant :

  1. Obtenez l'identifiant de la tâche.
  2. Définir sur la clé memcache comme 'task_%s' % task.id message 'Démarré'.
  3. Transmettez l'identifiant de la tâche au client.
  4. Maintenant, à partir du client, je peux surveiller l'état de la tâche (défini à partir des messages de tâche vers memcache).
  5. De la tâche au prêt - définissez le message de clé memcache « Prêt ».
  6. À partir du client sur la tâche prête - démarrez une tâche spéciale qui supprimera la clé du cache mémoire et effectuera les actions de nettoyage nécessaires.

-4voto

Har Points 508

Essayer

 AsyncResult('blubb').state

ça peut marcher.

Il devrait renvoyer quelque chose de différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X