Задать вопрос
yokotoka
@yokotoka
Python guru

Как сделать ПРОСТУЮ очередь в Celery (Python)?

Ребят, кто постиг дзен Celery! Подскажите пожалуйста.
Быстрый гугглёж по теме не дал понимания, как такое сделать в Celery.
a65a44a3f0294b0fbdbf003c716df6c0.jpg

Есть 2 системы. Первая - новая на python/flask, вторая - древняя на ibm/db2 (i400). Из новой системы при возникновении определённых событй необходимо отправлять одиночные sql-запросы на старую, (insert/update/delete). Их нужно выполнять в строгой последовательности (никакой асинхронности - предыдущая выполнилась, тогда и только тогда делаем следующую). Причём при возникновении любой ошибки, таска должна ставиться в НАЧАЛО очереди и пытаться выполниться снова (например, проблема сети или старая система упала). Другие таски должны ждать выполнения этой. То, что приходится ждать - неважно. Важно - сохранить строгую последовательность выполнения, когда ошибка исправлена.

Брокером для Celery использую Redis.

Этот процесс сейчас работает на самописном решении с использованием механизма очередей Redis и самописной обвязки, которая следит за выполнением в один поток и в строгой последовательности, при авариях бесконечно ставя последнюю таску в начало очереди и рестартуя её (разумеется, с дилеем). Но т.к. всю эту самопись решено перевести под популярную и поддерживаемую Celery, прошу подсказать рецепт приготовления такого в Celery.

Спасибо за внимание!
  • Вопрос задан
  • 4136 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@marazmiki
Укротитель питонов
Про то, как выполнять асинхронные задачи в последовательности написано в разделе canvas документации по celery. Там же и пример есть (копирую, чтобы сократить время)
>>> from celery import chain
# 2 + 2 + 4 + 8
>>> res = chain(add.s(2, 2), add.s(4), add.s(8))()
>>> res.get()
# или даже так
>>> (add.s(2, 2) | add.s(4) | add.s(8))().get()
16

здесь add, если не поняли, задача-пример, которая повсеместно встречается в документации. Она просто складывает два числа. А страшный метод .s() лишь короткая форма записи для .subtask(). В той же документации про canvas обо всём этом сказано в разделе Signatures.

Что касается повторений заваленных задач, то там всё просто и в документации есть. Единственное, нужно настроить RESULT_URL. Обратите внимание, не BROKER_URL, а именно RESULT, многие почему-то путают
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 14:07
15000 руб./за проект
22 дек. 2024, в 13:01
50000 руб./за проект
22 дек. 2024, в 10:44
15000 руб./за проект