Задать вопрос
LovingFox
@LovingFox
I catch hens

Как организовать двойную очередь в Python?

Добрый день.

Изучаю Python, работу очередей. Смотрю в сторону Celery.
Суть в следующем. Есть задача организовать обработку входящих сообщений. Схематично все представлено ниже на Рисунке 1.
Нужно распределять входящие сообщения по Воркерам для обработки и дальнейшей передачи другой программе. Но есть ограничение -- в один момент времени для конкретного devID может выполняться только одна обработка. Т.е. если Воркер еще не обработал прошлое сообщение для какого-то devID, а уже пришло новое сообщение с данным devID, то оно должно ожидать завершения обработки прошлого сообщения. По сути получается двойная очередь: по devID и по Воркерам.

Не пойму, как это осуществить через Celery. Или может вообще не в ту сторону копаю?

Рисунок 1.
02a7fcec74374d86bed011aba7364751.png
  • Вопрос задан
  • 2876 просмотров
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Две очереди, одна для всех сообщений, другая - для ожидающих.
Воркер:
1) получает сообщение из общей очереди
2) проверяет блокировку по devID
3) если блокировки нет:
3.1) ставит блокировку на devID
- делает работу
- освобождает блокировку на devID
3.2) блокировка есть:
- перепубликует сообщение в очередь ожидания, ТОЛЬКО если оно из основной очереди
4) проверяет очередь ожидания
- если там сообщение, то возвращается на п2
- иначе на п1

Как-то так... Ну и рассмотреть вопрос на счет дидлока, когда сообщение в очереди ожидания блокируется повисшим воркером...
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы