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

 Пока нахожусь в процессе изучения Python поэтому нуждаюсь в совете как правильно сделать.  

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

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

Наверняка уже есть что-то готовое. Или как минимум какие-то рекомендации как организуется очередь. 

 Вряд ли здесь вообще нужна очередь, т.к. запросы к разным датчикам друг с другом не связаны, т.е. могут производиться одновременно.  
  

У запроса должны быть атрибуты "датчик" и "подписчики".  

Каждый новый запрос имеет одного подписчика - создателя.  

Перед созданием нового запроса к датчику проверяется, есть ли уже запрос к нему.  

Если есть - туда добавляется ещё один подписчик.  

При завершении запроса результат сообщается всем подписчикам.  
  

На Python + Twisted сходу написать такое не смогу, на Perl + AnyEvent или на shell без проблем. 

 Копайте в сторону модуля **Queue**. К примеру, можете почитать вот здесь: [john16blog.blogspot.com/2012/05/python-queue.html](http://john16blog.blogspot.com/2012/05/python-queue.html) 

 Вам нужно реализовать простой менеджер очередей. В стандартной библиотеке Python есть несколько реализаций очередей, вам нужно сделать по простой [FIFO очереди](https://docs.python.org/2/library/queue.html#Queue.Queue) на каждый датчик. Можно сделать так же объект-заявку с тремя состояниями - pending, processing, done. Соответственно все новые заявки впихиваются в pending, как только заявка ушла на обработку в датчик - ей ставится статус processing, и затем, по получению данных - done и она выкидывается из очереди.  
  

Можно так же сделать обертку-менеджер таких очередей. Если вы хотите сделать ее еще и асинхронной... то тут надо либо вешать обработчики результатов либо добавлять результаты в свою очередь. Эдакий конвейер. 

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