web-dev-qa-db-fra.com

Céleri - Obtenir l'ID de tâche pour la tâche en cours

Comment puis-je obtenir la valeur task_id d'une tâche à l'intérieur de la tâche? Voici mon code:

from celery.decorators import task
from Django.core.cache import cache

@task
def do_job(path):
    "Performs an operation on a file"

    # ... Code to perform the operation ...

    cache.set(current_task_id, operation_results)

L'idée est que lorsque je crée une nouvelle instance de la tâche, je récupère le task_id à partir de l'objet de tâche. J'utilise ensuite l'ID de tâche pour déterminer si la tâche est terminée. Je ne pas souhaite garder une trace de la tâche par la valeur path car le fichier est "nettoyé" une fois la tâche terminée et peut ou non exister.

Dans l'exemple ci-dessus, comment puis-je obtenir la valeur de current_task_id?

70
mattbasta

Celery définit certains arguments de mot clé par défaut si la tâche les accepte. (vous pouvez les accepter soit en utilisant ** kwargs, soit en les listant spécifiquement)

@task
def do_job(path, task_id=None):
    cache.set(task_id, operation_results)

La liste des arguments de mots clés par défaut est documentée ici: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

9
asksol

Depuis Celery 2.2.0, les informations relatives à la tâche en cours d'exécution sont enregistrées dans task.request (ça s'appelle "le contexte"). Vous devriez donc obtenir l'ID de la tâche à partir de ce contexte (pas à partir des arguments de mots clés, qui sont obsolètes):

@task
def do_job(path):
    cache.set(do_job.request.id, operation_results)

La liste de tous les champs disponibles est documentée ici: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

112
Alex Lokk

Depuis céleri 3.1, vous pouvez utiliser l'argument décorateur bind et avoir accès à la requête en cours:

@task(bind=True)
def do_job(self, path):
    cache.set(self.request.id, operation_results)
49
Balthazar Rouberol