2012-01-25 3 views
2

Я пытаюсь постоянно отслеживать состояние устройства, используя оператор While True. проект почти завершен. Перед поставкой я столкнулся с проблемой.Непрерывный мониторинг состояния с использованием оператора while

Код:

while True: 
    # monitor the state of this device.. 
    # when ever this device state changes . 
    # raise an alert. 
    # 
    break 

Это алгоритм, на котором он работает. Но когда я пытаюсь постоянно контролировать систему, процессор постоянно используется, и скрипт использует постоянно около 30% процессора. Я хочу уменьшить его до нуля. Возможно ли это в python?

Я не могу использовать time.sleep(sec), поскольку это должно быть очень точным. Пожалуйста, помогите мне в решении этой проблемы.

+1

Как «очень» точный вы должны быть? Попробуйте 'sleep (0.1)', он работает на системных системах. Если вам нужна точность в миллисекундах, возможно, Python - это не правильный инструмент. – 9000

ответ

0

Скорее всего, вы не действительно не хотите, чтобы опрос что-то непрерывно в цикле while, так же быстро, как позволяет ваш процессор.

перспективе это:

while True: 
    pass 

уведомление ваш процессор теперь искусственно поддерживается на уровне 100% используемого (или, по меньшей мере, 1 ядро).

1

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

Если ваша проблема в том, что вы просто не хотите ждать целую секунду, чтобы поймать событие, вы можете указать значение с плавающей запятой:

import time 
time.sleep (0.1) 

Разница между следующими двумя программами показывает, как даже небольшая задержка выручает, основанная на управлении top под Ubuntu 11.04, Python 2.7.1:

# Will peg at 100%   # Won't even reach 1% 
import time    import time 
while True:    while True: 
    pass      time.sleep(0.01) 
           pass 

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

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

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

+0

Меня интересует только процесс CPU. он срабатывает, когда я начинаю этот скрипт до 60% и постоянно останавливается на 30%. Этого не может быть. Сценарий должен молча слушать и находиться в состоянии ожидания, пока не произойдет изменение состояния устройства. – Bala

+0

@Bala - тогда не опробуйте. Если вам нужно такое поведение, вам нужна стратегия, основанная на прерываниях. – paxdiablo

+0

Устройство на самом деле является аппаратным (внешний HDD и другие периферические элементы). Я пишу сценарий, который будет следить за изменениями. Все внешние жесткие диски подключаются через USB. Я хотел отслеживать все HDD и его состояние соединения. Много раз я сталкиваюсь с проблемами с отключением внешнего диска, в результате чего мы сталкиваемся с проблемами. Также необходимо контролировать состояние Ethernet и обновлять, когда есть переключатель трафика между 2 ethernets. Поэтому я в основном использовал While True: заявления для проверки статуса, особенно для дисков. Облицовка проблем с использованием ЦП. – Bala

2

Что такое «устройство», действительно ли это устройство, такое как аппаратное обеспечение? Или это ваш программный компонент?

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

Вы должны Google для наблюдателя шаблона проектирования, вот хороший пример питона я использовал в прошлом: http://code.activestate.com/recipes/131499-observer-pattern/

+0

Если нет собственного способа регистрации для «сигнала», который должен быть испущен, OP по-прежнему необходимо реализовать его с использованием какой-либо формы опроса. –

+0

Да, поэтому я спросил, было ли это аппаратное устройство или программный компонент. – wim