LovingFox
@LovingFox
I catch hens

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

Добрый день.

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
Bonrepublic Москва
от 150 000 до 180 000 ₽
OnederX Москва
от 100 000 до 120 000 ₽
от 150 000 до 180 000 ₽
18 сент. 2020, в 17:52
1000 руб./за проект
18 сент. 2020, в 17:49
500 руб./в час
18 сент. 2020, в 17:24
180 руб./за проект