2017-01-30 1 views
1

J'utilise Céleri + RabbitMQ pour des tâches dans ma file d'attente Django App,Est-il possible d'interroger l'état d'une tâche de céleri en utilisant les résultats de django-céleri lors de l'exécution d'une tâche?

Je veux suivre l'état d'une tâche à l'aide du task_id et task_state.

Pour que je créé un TaskModel (modèle) pour stocker les task_id, task_state et quelques données supplémentaires dans la base de données. Lors de l'exécution de la tâche, un nouvel objet TaskModel est sauvegardé et mis à jour au fur et à mesure de l'avancement de la tâche. Tout fonctionne bien.

Cependant, je dois encore ajouter un grand nombre de fonctionnalités et de fonctionnalités et protections d'erreur, etc. C'est quand je me suis rappelé la documentation de céleri mentionne les django-céleri-résultats.

donc j'ai suivi les instructions de la documentation django-céleri-résultats. Tâches résultats sont stockés dans la base de données de django par défaut dans une table dédiée, Cependant seulement après que la tâche se termine ... et non pendant INCIDENT, les Etats Mise en route.

Est-il possible d'utiliser django-céleri-résultats pour stocker et tâches de requête au cours des états en cours et pour commencer? ou pas?

Merci

Répondre

0

Après avoir examiné le code source de django-céleri-résultat, il se le code est assez simple et simple.

Pour utiliser django-céleri-résultat pour stocker les tâches après la fonction de tâche est appelée utilisez les touches suivantes:

from django_celery_results.models import TaskResult 
import json 

@shared_task(bind=True) 
def foo(self, count): 
print('hello') 
task_result = TaskResult.objects.get(self.request.id) 
counter = 1 
interval = 20 #Limit updates to reduce database queries 
interval_count = count/interval 
for i in range(count): 
    print(i) 
    if counter>= interval_count: 
    interval_count+=count/interval 
    task_result.meta = json.dumps({'progress': counter/count}) 
    task_result.save() 
    counter+=1 
task_result.save() 
return 

def goo() 
task = foo.delay(1000) 
task_result = TaskResult(task_id=task.task_id) 
task_result.save() 
+1

task_result = TaskResult.objects.get (self.request.id) ce qui est soi dans cette ligne? – Alexey

+0

Est-ce une erreur? Pourquoi vous utilisez-vous en dehors de toute classe? – Alexey

+0

Bonjour, vous avez en partie raison, la définition de la fonction devrait se déclarer, sinon elle produira une erreur. Lorsque bind est défini sur True (bind = True), dans le décorateur @shared_task. self fait référence à l'instance de tâche en cours. Je modifie la définition de la fonction en conséquence. – Ouss