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

Пока нахожусь в процессе изучения Python поэтому нуждаюсь в совете как правильно сделать.
Есть вот такая задачка. К линукс машине подключено много всякой периферии вроде датчиков. Для опроса этих датчиков есть ряд команд. Принцип простой - запрос на датчик, датчик получив запрос обрабатывает его и отвечает. Есть ограничение - датчик может обработать только один запрос в один момент времени, если на него отправить еще один запрос в момент пока он обрабатывает предыдущий запрос, то новый запрос просто отбросится. Доступ к линукс машине многопользоватльский - часть простые люди, часть другие машины.
Есть желание написать небольшой скрипт (или что-то вроде того), который организует очередь, так чтобы запросы (для одного датчика) на получение информации с датчика ставились в очередь и по мере возможности обрабатывались.

Наверняка уже есть что-то готовое. Или как минимум какие-то рекомендации как организуется очередь.
  • Вопрос задан
  • 8492 просмотра
Пригласить эксперта
Ответы на вопрос 4
IlyaEvseev
@IlyaEvseev
Opensource geek
Вряд ли здесь вообще нужна очередь, т.к. запросы к разным датчикам друг с другом не связаны, т.е. могут производиться одновременно.

У запроса должны быть атрибуты "датчик" и "подписчики".
Каждый новый запрос имеет одного подписчика - создателя.
Перед созданием нового запроса к датчику проверяется, есть ли уже запрос к нему.
Если есть - туда добавляется ещё один подписчик.
При завершении запроса результат сообщается всем подписчикам.

На Python + Twisted сходу написать такое не смогу, на Perl + AnyEvent или на shell без проблем.
Ответ написан
Комментировать
JRazor
@JRazor
Senior StarkOverFlow Programmer
Копайте в сторону модуля Queue. К примеру, можете почитать вот здесь: john16blog.blogspot.com/2012/05/python-queue.html
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вам нужно реализовать простой менеджер очередей. В стандартной библиотеке Python есть несколько реализаций очередей, вам нужно сделать по простой FIFO очереди на каждый датчик. Можно сделать так же объект-заявку с тремя состояниями - pending, processing, done. Соответственно все новые заявки впихиваются в pending, как только заявка ушла на обработку в датчик - ей ставится статус processing, и затем, по получению данных - done и она выкидывается из очереди.

Можно так же сделать обертку-менеджер таких очередей. Если вы хотите сделать ее еще и асинхронной... то тут надо либо вешать обработчики результатов либо добавлять результаты в свою очередь. Эдакий конвейер.
Ответ написан
Комментировать
xSkyFoXx
@xSkyFoXx
Если Вам всё же хочется для данной задачи применить очередь, при этом Вы хотите, чтобы она была чуть более мощной чем та, что является частью стандартной библиотеки, я советую Вам посмотреть на биндинг к питону со стороны ZMQ (pyzmq). А если суть в том, чтобы просто применить серьёзные и мощные очереди для собственно интереса, тогда можно поиграться и с RabbitMQ, который очень просто ставится имеет стандартный биндинг к python.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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