Я пытаюсь реализовать трудоемкие вычисления с помощью Celery (v 3.1.25).Мне нужно получить уже работающего работника по параметру, который прошел при запуске задачи.
Клиент передает company_id на сервер, и Celery запускает работника с заданным параметром.Может быть много клиентов, которые передают один и тот же company_id, поэтому я должен проверить, что процесс еще не запущен.Если он выполняется, задача не должна планироваться, потому что результат выполнения одного и того же процесса всегда один и тот же, и мы должны сказать ему, что задача уже выполняется.
@celery_app.task(bind=True)
def calculate(self, company_id):
obj_list = get_objects(company_id)
for i, obj in enumerate(obj_list):
self.update_state(state='PROGRESS', meta={'current': i, 'total': len(obj_list)})
result = calc(
registry=registry_key,
company_id=company_id,
)
return result
Я думаю о сохранениитекущий статус в Postgres
базе данных, где модель будет work_id, status (PROGRESS/SUCCESS), start_time, finish_time
.В этом случае вопрос заключается в том, как справиться с тем, что статус работы изменился?И правильно ли хранить такую информацию в базе данных?Есть ли другие варианты решения этой проблемы?
Я смотрел на celery-Once , но не нашел там метода, который мог бы сказать мне, что этот процесс запущен (я хочу сообщить об этом пользователю).
Может быть, я мог бы что-нибудь сделать с Redis?