Джанго Селективная Дампдата

Создание объекта AsyncResult из идентификатора задачи является способом, рекомендованным в FAQ , чтобы получить статус задачи, когда единственное, что у вас есть, - это идентификатор задачи.

Однако, с Celery 3.x, есть существенные оговорки, которые могут укусить людей, если они не обратят на них внимания. Это действительно зависит от конкретного сценария использования.

По умолчанию сельдерей не записывает «запущенное» состояние.

Чтобы сельдерей мог записывать, что задача запущена, вы должны установить task_track_started на True. Вот простая задача, которая проверяет это:

@app.task(bind=True)
def test(self):
    print self.AsyncResult(self.request.id).state

Когда task_track_started - False, по умолчанию это показ состояния PENDING, даже если задача запущена. Если вы установите task_track_started на True, тогда состояние будет STARTED.

Состояние PENDING означает «Я не знаю».

AsyncResult с состоянием PENDING не означает ничего, кроме того, что сельдерей не знает статуса задачи. Это может быть связано с любым числом причин.

С одной стороны, AsyncResult может быть сконструирован с недопустимыми идентификаторами задач. Такие «задачи» будут считаться ожидаемыми сельдерей:

>>> task.AsyncResult("invalid").status
'PENDING'

Хорошо, поэтому никто не собирается кормить , очевидно , недопустимыми идентификаторами AsyncResult. Достаточно справедливо, но также имеет эффект, что AsyncResult также рассмотрит задачу, которая успешно выполняется, но что Сельдерей забыл как PENDING. Опять же, в некоторых сценариях использования это может быть проблемой. Часть проблемы зависит от того, как Celery настроен на сохранение результатов задач, потому что это зависит от наличия «надгробных камней» в базе данных результатов. («Надгробные плиты» - это термин, используемый в документации по сельдеру для блоков данных, которые записывают, как закончилась задача.) Использование AsyncResult не будет работать вообще, если task_ignore_result - True. Более неприятная проблема заключается в том, что сельдерей по умолчанию разрушает надгробные плиты. По умолчанию установка result_expires установлена ​​на 24 часа. Поэтому, если вы запускаете задачу и записываете идентификатор в долгосрочном хранилище, а более 24 часов спустя, вы создаете с ним AsyncResult, статус будет PENDING.

Все «реальные задачи» начинаются в состоянии PENDING. Поэтому получение PENDING в задаче может означать, что задача была запрошена, но никогда не продвигалась дальше этого (по какой-либо причине). Или это могло означать, что задача была выполнена, но Сельдерей забыл о своем состоянии.

Ой! AsyncResult не будет работать для меня. Что еще я могу сделать?

Я предпочитаю отслеживать цели , чем отслеживать сами задачи . Я сохраняю некоторую информацию о задаче, но она действительно является вторичной для отслеживания целей. Цели хранятся в хранилище независимо от Сельдерея. Когда запрос должен выполнять вычисления, зависит от достижения определенной цели, он проверяет, была ли достигнута цель, если да, то она использует эту кешированную цель, в противном случае она запускает задачу, которая будет влиять на цель, и отправляет клиент, который сделал HTTP-запрос ответом, который указывает, что он должен ждать результата.


Названия переменных и гиперссылок выше для Celery 4.x. В 3.x соответствующие переменные и гиперссылки: CELERY_TRACK_STARTED , CELERY_IGNORE_RESULT , CELERY_TASK_RESULT_EXPIRES .

34
задан Cerin 29 November 2011 в 15:42
поделиться