2013-12-01 3 views
2

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

В приложениях я создаю нить для каждого экземпляра датчика. Это пример кода

self.phThreadDict[phDevId] = tempsensor(self, phDevId, phIpAddr, phIpPort, phSerial, self.triggerDict) 
self.phThreadDict[phDevId].start() 

В каждой нити I обработчики установки обратного вызова для событий, отправленных датчиком, а затем перейти в петлю на конце.

while not self.shutdown: 
    self.plugin.sleep(0.5) 

Затем потоки обрабатывают входящие события и совершают вызовы в основной поток или в реальную программу, которая породила основной поток. Все это работает очень хорошо.

Но иногда мне также нужно отправлять запросы на конкретный датчик. Методы определены в каждом потоке для этой цели, и я вызываю эти методы из основного потока. Например:

self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage) 

Это также работает, но я считаю, что код на самом деле выполняется в основном потоке, а не в потоке конкретного к датчику.

Мой вопрос: Какие параметры у меня есть для передачи работы конкретному потоку цели и выполнения потока выполнения работы, а затем возврата или неудачи?

ответ

2

Действительно, это код выполнения в основном потоке.


Use queues, это то, что они предназначены для (синхронизации задач и передачи сообщений между потоками).

Используйте одну очередь на поток диспетчера датчика.

  • Ваши потоки диспетчера сенсоров должны получать предметы из очереди вместо сна (это блокирующий вызов).
  • Ваш «основной» поток должен помещать элементы в очередь вместо запуска функций (это, как правило, неблокирующий вызов).

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

3

Расширение немного на спот-на комментарии Томаса Ороско,

self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage) 

выполняется в зависимости от того, поток запускает его. Если вы запустите его от основного потока, то основной поток будет делать все это. Если из какого-то другого потока, то этот поток будет запускать его.

В дополнении к Queue в поток, для резьбы до получить описание рабочих элементов для обработки, вы также хотите, один Queue для потоков ставить результатов на (вы можете также использовать другой Queue на волосок это, но это слишком много).

Основная нить вытащит результаты с последних Queue. Обратите внимание, что вы можете - и это очень часто делать - поместите кортежи на Queues. Так, например, на ток-обратно-к-основной-нить Queue нити, вероятно, поместить кортежи вида:

(result, my_thread_id, original_work_description) 

Этого достаточно, чтобы понять, какой поток возвращается то, что результат, в ответ на которые работают пункт. Возможно, вам не нужно все это. Возможно, вам нужно больше, чем это. Не могу догадаться ;-)

Смежные вопросы