@SevenEven22
Python developer

Как реализовать последовательное выполнение задач Celery?

У меня есть селери таска, которая вызывает парсер XML юзер-профайлов из папок в БД. Таска вызывается при парсинге каждого XML в папке, но задачи выполняются в хаотичном порядке(я так полагаю асинхронно), из-за чего возникает проблема фото юзера, они часто неправильно подтягиваются. Собственно вопрос в том, как выполнять таски последовательно. Условно одна задача взялась и пока она не выполнится, не начнется выполнятся следующая, либо же сделать какую-то задержку перед выполнением. Да, я теряю во времени исполнения, но зато будет правильно.
  • Вопрос задан
  • 344 просмотра
Решения вопроса 1
@pyHammer
Влад Коваль, я решал подобную задачу следующим образом. Мне нужно было писать лог количества в асинхронных задачах, но лог получался примерно такой -> 4, 3, 5, 2, 1, -1, 0 и тд. из-за того что задачи выполнялись параллельно. Решение следующее, нужно создать 4 (или сколько вам будет нужно) очереди default_0, default_1, default_2, default_3, так как обработка выполнялась над записью в БД, то я имел id этой записи. Я брал остаток от деления id % 4, где 4 это количество очередей, на выходе получал число от 0 до 3 и в зависимости какое получалось число я в ту очередь и отправлял задачу. Таким образом работа над записью с определенным id всегда выполнялась в определенной очереди.
Разумеется все эти 4 очереди нужно запускать в 1 инстанс
celery --app=conf.celery.application worker -c 1 -Q localhost_0
celery --app=conf.celery.application worker -c 1 -Q localhost_1
celery --app=conf.celery.application worker -c 1 -Q localhost_2
celery --app=conf.celery.application worker -c 1 -Q localhost_3

Задачи в очередь помещаются вот так
update_quantity_task.apply_async(
    kwargs={
        'goods_id': related_product.goods_id,
    },
    queue='default_{}'.format(related_product.goods_id % 4),
)

Вот и все, задачи выполняются и параллельно и последовательно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы