Сельдерей - Получить идентификатор задачи для текущей задачи
Как я могу получить значение 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
?
Ответы
Ответ 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)