Подтвердить что ты не робот

Сельдерей - Получить идентификатор задачи для текущей задачи

Как я могу получить значение 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?

4b9b3361

Ответ 1

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

Ответ 2

Начиная с версии task.request 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

Ответ 3

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

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