Группируйте результаты сельдерея

#python-3.x #celery

#python-3.x #сельдерей

Вопрос:

TL: DR Я хочу пометить результаты в серверной части.

У меня есть проект flask / celery, и я новичок в сельдерее. Пользователь отправляет пакет задач для работы с сельдереем. Celery сохраняет результаты в серверной базе данных SQL (таблица, автоматически созданная Celery, с именем celery_taskmeta).

Я хочу, чтобы пользователь мог видеть статус своего пакета и запрашивать результаты у серверной части.

Моя проблема в том, что все результаты находятся в одной таблице. Какие у меня есть варианты для маркировки этого пакета, чтобы пользователь мог различать пакеты?

Мои идеи:

  • Могу ли я добавить ярлык к каждой задаче, например, «Партия Боба № 12», а затем запросить celery_taskmeta ее?
  • Могу ли я поместить каждый пакет в именованные внутренние таблицы, поэтому попросите Celery сохранить результаты в таблице с именем task_12 ?

Попытка с группами

Я попробовал следующий код для группировки результатов

 job_group = group(api_get.delay(url) for url in urllist)
 

Но я не вижу никакого способа идентифицировать группу в бэкэнд / базе данных результатов
введите описание изображения здесь

Попытка с именем задачи

В серверной части я вижу пустой заголовок столбца ‘name’, поэтому я подумал, что могу добавить туда произвольную строку:

 @app.task(name="an amazing vegetable")
def api_get(url: str) -> tuple:
...
 

Но затем работник сельдерея выдает ошибку при запуске задачи:

 KeyError: 'an amazing vegetable'
[2020-12-18 12:07:22,713: ERROR/MainProcess] Received unregistered task of type 'an amazing vegetable'.
 

Ответ №1:

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

A1: Что касается вопроса с меткой — да, вы можете «пометить» свою задачу с помощью функции пользовательского состояния.

A2: вы можете взломать, чтобы поместить каждую партию задач внутри внутренней таблицы, но я настоятельно рекомендую не связываться с этим. Если вы действительно хотите пойти по этому пути, создайте отдельную базу данных для этого конкретного использования.

Комментарии:

1. Привет @DejanLekic, я попробовал group и обновил свой вопрос. Я посмотрел на A1, обычное состояние, но я бы предпочел этого не делать, поскольку я хочу использовать состояния по умолчанию.