2017-06-06 1 views
2

Pour mon application Web, j'utilise celery avec redis backend. Official FAQ vise la façon suivante pour acquérir le résultat d'une tâche si j'ai l'ID de la tâche.Comment obtenir les arguments transmis à la tâche du céleri?

result = my_task.AsyncResult(task_id) 
result.get() 

Je peux facilement accéder à des arguments dans le corps de la tâche:

@app.task 
def my_task(foo, bar, baz=None): 
    kwargs = self.request.kwargs 
    args = self.request.args 

Y at-il un moyen d'obtenir args et kwargs du AsyncResult ou où juste avoir l'identifiant de tâche?

Répondre

0

Si la tâche est en attente ou si elle s'exécute actuellement, vous pouvez voir les arguments de la tâche as mentioned here.

Si vous souhaitez obtenir les arguments d'une tâche ayant échoué, vous pouvez configurer une tâche de base personnalisée avec le gestionnaire on_failure pour obtenir des arguments lorsque les tâches échouent.

from celery import Task 

class CustomBaseTask(Task):   

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     print(args) 

@app.task(base=CustomBaseTask) 
def add(x, y): 
    raise error 

D'autre part, si votre tâche est exécutée avec succès, vous aurez résultat seulement et vous ne pouvez pas récupérer vos arguments que ces informations ont été consommés et transformés par les travailleurs des courtiers.

+0

Le problème est que j'ai besoin de ces arguments non seulement après le succès/l'échec d'une tâche, mais après, par exemple, une semaine, jusqu'à ce qu'ils soient expirés dans les redis. Maintenant, je pense que c'est impossible puisque le céleri ne les sauvegarde pas dans le backend. –

+0

Vous pouvez explicitement sauvegarder les arguments en redis avec la combinaison id de la tâche. – ChillarAnand