Селера - Отримайте ідентифікатор завдання для поточного завдання


77

Як я можу отримати значення 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?

Відповіді:


9

Селера встановлює деякі аргументи ключових слів за замовчуванням, якщо завдання приймає їх. (Ви можете прийняти їх, скориставшись ** 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


34
Це застаріло станом на Celery 2.2.0 (див. Відповідь нижче).
Саймон

123

Починаючи з 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


1
Ви можете отримати цей ідентифікатор поза завданням? наприклад, запустити завдання, отримати ідентифікатор і перевірити за допомогою цього ідентифікатора, чи завдання закінчено.
DominiCane

Так, ви можете отримати ідентифікатор з AsyncResult, а потім заново створити AsyncResult за ідентифікатором, перевірити документи docs.celeryproject.org/en/latest/reference/celery.result.html
Алекс

Використовуйте відповідь Бальтазара, якщо у вас Celery 3+. Це чіткіше та зрозуміліше.
Алекс

72

Станом на селеру 3.1 ви можете використовувати bindаргумент декоратора та мати доступ до поточного запиту:

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

2
Дякую за нову відповідь. Працює як оберіг
Олександр Дашков

Чи можна також дізнатися, чи було це періодичним завданням чи ні?
PythonEnthusiast
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.