Django, Celery и последовательные асинхронные задачи
Я строю систему на Django, которая использует Celery и Django-Celery-Beat для выполнения задач по созданию и извлечению данных.
Я извлекаю записи из хранилища данных, используя его API, и на основе этого создаю несколько jsonl-файлов в качестве конечного результата - эти файлы становятся основой для всех последующих задач. Затем создаются изображения, используя информацию из jsonl файлов, а затем эти файлы используются для обновления других систем (а именно Solr).
Все это работает нормально. Только часть с сельдереем ставит меня в тупик.
Эти задачи должны выполняться последовательно, и каждая из них не может завершиться неудачей, а если она произойдет, последовательность должна быть остановлена. Мне также нужно заблокировать задачи от запуска дважды, так как это испортит jsonl файлы, создание образа и т.д.....
Я рассматривал возможность использования Celery и цепочек с неизменяемыми сигнатурами, поскольку задачи ничего не возвращают, они создают файлы, изображения и т.д.....
Но я не могу найти метод блокировки задач, чтобы они не выполнялись дважды в одно и то же время.
Итак, вопросы состоят из двух частей
What is the best method for running periodic tasks in Django that needs to run asynchronously but also sequentially within that task? Is Celery the best way? Is Django Q a better tools for this. Django Q has chains, but they work slightly different that Celery.
What would the general logic look like to prevent it from running twice? I have tried numerous methods, python_redis_lock, and a few decorations found about the web, but nothing seemingly works twice in a row — or the lock is never released, or worse the lock is immediately released.
Это достаточно сложная вещь - выполнение задач в строгом порядке, но в фоновом режиме. Я нигде не могу найти хороший рабочий ответ, который бы кликабельно или четко объяснял, что происходит.
Спасибо за любое направление в этом вопросе.