2016-06-28 5 views
0

У меня есть код, который выглядит как:Как я могу сделать сон python в режиме реального времени?

while True: 
    do things over the internet: 
    time.sleep(3600) 

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

+2

Какая ОС вы используете? Если бы его Mac OS X или Linux каким-то образом я предложил бы использовать Crontab вместо – SAMO

+0

Так как «realtime» имеет перегруженное значение, я бы предложил перефразировать это «настенное время часов» или «абсолютное время». – deceze

+0

В модульном времени у вас есть time.clock(), который вы могли бы использовать в другом цикле while. – Sosel

ответ

3

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

lastDone = None # Avoid unbound local errors 
while True: 
    if lastDone is None or is_one_hour_ago(lastDone): # Write is_one_hour_ago() 
     # Do things 
     lastDone = time.now() # Not a real function yet 
    else: 
     sleep(600) # Sleep for a minute and check again 

is_one_hour_ago вероятно нужен модуль DATETIME, но относительно простая логика, как только вы получите это написано (возвращение Правда, если в настоящее время минус один час> = lastDone еще False), и вы должны смотреть на python's datetime. Или время clock.

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

+0

Точность так же высока, как и во время сна, поэтому, если вы спите минуту, у вас могут быть отклонения в минуту. – syntonym

+0

Обычно это единичный блок Unix, т.е. 0,001 секунды, и он получает точную точность и не использует 100% процессор в цикле. Кроме того, обычно вы делаете более длинные паузы между тем, когда вы знаете, что ответ может быть несколько неточным или медленным. Например, когда ПК не работает, и пользователь не ожидает получить то, что он/она должен получить. Но все зависит от цели программы, конечно. – Dalen

1

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

Это ломается, когда происходит что-то другое, например KeyboardInterrupt.

Итак, поставьте sleep() в оператор try и используйте time.clock() или time.time(), чтобы узнать, сколько времени прошло между перерывом сна() и последующим возникновением продолжения цикла для продолжения сна, или просто оставьте это прервано:

try: time.sleep(360) 
except: pass 

Итак, программа должна продолжаться без каких-либо ошибок.

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

См., Когда ОС хочет выйти или выключиться, или перейдет в режим сна, он отправит уведомление в виде какого-либо события, сигнала или паузы в обслуживании. Сон, несколько конкретный, и это может быть не так на всех ОС.

Вы должны поймать это и сделать с ним что-то полезное.

Сигналы управлять с помощью сигнального модуля,

события конкретной системы, и это может быть сложным. на Mac OS X это может быть что угодно: от события высокого уровня в AppScript или очереди событий или от сообщения MacPort, которое усложняет ситуацию, но API-интерфейсы там не беспокоятся.

В Windows вам, вероятно, придется использовать модуль wininstypes winservice для создания полезного управления сервисами.

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

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

Для решения проблем возврата из спящего режима было бы лучше использовать threading.Timer() для выполнения вашей работы.

Это поток, который вызывается функцией, которую вы регистрируете по истечении указанного времени.

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

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

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

Когда вы повесите все это, это легко, не волнуйтесь. Просто прочитать. : D

Может быть много других решений.

Как автоматический запуск небольшого процесса при входе в систему, в котором говорится о вашем процессе, что он должен что-то делать и т. Д. И т. Д. Теперь все зависит от вашего творчества.

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