2009-08-25 5 views
12

Я создал сценарий для мониторинга вывода последовательного порта, который получает 3-4 строки данных каждые полчаса - скрипт работает отлично и захватывает все, что выходит из порта, который на конец дня - это то, что имеет значение ...Python/PySerial и использование ЦП

Что-то меня беспокоит, что использование процессора кажется довольно высоким для программы, которая контролирует только один последовательный порт, 1 ядро ​​всегда будет на 100% использовании, в то время как это скрипт запущен.

Я в основном работает модифицированную версию кода в этом вопросе: pyserial - How to Read Last Line Sent from Serial Device

Я попытался функция inWaiting() через регулярные промежутки времени опроса и с его спать, когда inWaiting() 0 - I» вы пробовали интервалы от 1 секунды до 0,001 секунды (в основном, так часто, как я могу, без повышения производительности процессора) - это будет успешным в захвате первой линии, но, похоже, пропустят остальные данные.

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

  • Должно ли python/pyserial использовать это много процессора? (это похоже на излишний)
  • Я трачу свое время на этот квест/Должен ли я просто укусить пулю и запланировать сценарий, чтобы спать в течение периодов, которые, как я знаю, не будут поступать?

ответ

13

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

+0

Удивительный! Теперь он мурлычет, как котенок, рядом с потреблением процессора, и он захватывает все, что я бросаю в него. Я использовал read (inWaiting()) под впечатлением, что он будет работать так же, как и читать (1) - очевидно, это не так. Спасибо, что освободил меня. –

+0

Прохладный, и спасибо за то, что заставил меня открыть pyserial, я буду рассматривать его в следующий раз, когда я играю с последовательными портами :) – tonfa

+0

Отлично - безболезненно настроить и использовать, это было единственное, с чем я столкнулся, и ** I ** была проблема. –

0

Будет ли решение системного стиля лучше? Создать скрипт python и выполнить его через Cron/Scheduled Task?

pySerial не должен использовать такой процессор, но если он просто сидит там в течение часа, я вижу, как это может произойти. Сон может быть лучшим вариантом в сочетании с периодическим пробуждением и опросами.

+2

Если вы запустите cron или сон, вы пропустите серийный выход. Программа должна запускаться как демон или активный процесс. – jmanning2k

+0

Я ценю предложение TheLobster, но jmanning2k имеет право на это - это значит быть демоном вроде процесса. Мы будем получать данные каждые полчаса, но это примерно так же точно, как и будет. Подход cron/schedule task должен быть * безумно * точным в своем сроке для работы, и наименьшее расстройство может привести к потере данных. Этого просто не будет. –