Celery - Получить идентификатор задачи для текущей задачи - PullRequest
69 голосов
/ 21 июля 2010

Как я могу получить значение task_id для задачи внутри задачи? Вот мой код:

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)

Идея состоит в том, что когда я создаю новый экземпляр задачи, я получаю task_id из объекта задачи. Затем я использую идентификатор задачи, чтобы определить, завершена ли задача. Я не хочу отслеживать задачу по значению path, поскольку файл «очищается» после завершения задачи и может существовать или не существовать.

В приведенном выше примере, как я могу получить значение current_task_id?

Ответы [ 3 ]

112 голосов
/ 11 ноября 2011

Начиная с Celery 2.2.0, информация, связанная с выполняемой в данный момент задачей, сохраняется в task.request (он называется «контекст»). Таким образом, вы должны получить идентификатор задачи из этого контекста (а не из аргументов ключевых слов, которые устарели):

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

Список всех доступных полей документирован здесь: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

48 голосов
/ 14 декабря 2015

Начиная с версии Celery 3.1, вы можете использовать аргумент декоратора bind и иметь доступ к текущему запросу:

@task(bind=True)
def do_job(self, path):
    cache.set(self.request.id, operation_results)
9 голосов
/ 22 июля 2010

Celery устанавливает некоторые ключевые аргументы по умолчанию, если задача их принимает. (вы можете принять их, используя ** kwargs, или перечислить их отдельно)

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

Список аргументов ключевых слов по умолчанию задокументирован здесь: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...