2010-12-02 4 views
11

Comment puis-je tester si une tâche (task_id) est toujours traitée dans celery? Je le scénario suivant:Teste si une tâche de céleri est toujours en cours de traitement

  1. Démarrer une tâche dans une vue Django
  2. Stocker le BaseAsyncResult dans la session
  3. Arrêtez le démon de céleri (dur) de sorte que la tâche est Traitées plus
  4. Vérifiez si la tâche est 'morte'

Des idées? Est-ce qu'une recherche peut être effectuée sur toutes les tâches traitées par le céleri et vérifier si le mien est toujours là?

+1

Hey Je cherche aussi quelque chose de semblable à cela, avez-vous jamais se déplacer pour résoudre cela? Je me demande s'il faut stocker le task_id dans la structure de cache de django à la place. Je sais que je peux utiliser quelque chose comme http://dpaste.com/370419/ pour obtenir le statut de la tâche. Mais je suis confus entre l'utilisation de la base de données, cache pour stocker task_id. – Chantz

Répondre

3

définir un champ (PickledObjectField) dans votre modèle pour stocker la tâche de céleri:

class YourModel(models.Model): 
    . 
    . 
    celery_task = PickledObjectField() 
    . 
    . 

    def task(): 
     self.celery_task = SubmitTask.apply_async(args = self.task_detail()) 
     self.save() 

Dans le cas où votre tâche n'est pas spécifique sur un modèle, vous devez créer un spécialement pour les tâches de céleri. Sinon je suggère d'utiliser django-céleri. Il a une fonction de surveillance agréable:
http://ask.github.com/celery/userguide/monitoring.html#django-admin-monitor, enregistre les détails des tâches dans un modèle django d'une manière graphique agréable.

+0

Oui, j'utilise django-celery et j'effectue des recherches dans le modèle interne de TaskMeta pour obtenir l'état. Merci d'avoir répondu. –

0

Je pense qu'il existe un meilleur moyen que de stocker un objet de tâche dans le modèle. Par exemple, si vous voulez vérifier si un groupe de travail (parallèle) ont terminé:

# in the script you launch the task 
from celery import group 

job = group(
    task1.s(param1, param2), 
    task2.s(param3, param4) 
) 
result = job.apply_async() 
result.save() 

# save the result ID in your model 
your_obj_model = YourModel.objects.get(id='1234') 
your_obj_model.task_id = result.id 
your_obj_model.save() 

Alors à votre avis

from celery.result import GroupResult 
# ... 
task_result = GroupResult.restore(your_obj_model.task_id) 
task_finished = task_result.ready() 
# will be True or False 
Questions connexes