time.sleep и приостановить (т.е. в режиме ожидания и гибернации) - PullRequest
2 голосов
/ 13 ноября 2009

Например, если я выполню time.sleep (100) и немедленно переведу компьютер в спящий режим на 99 секунд, будет ли следующий оператор выполнен через 1 секунду или 100 секунд после пробуждения?

Если ответом является 1 секунда, как вы «спите» 100 секунд, независимо от продолжительности гибернации / ожидания?

Ответы [ 3 ]

5 голосов
/ 13 ноября 2009

time.sleep(N) пытается уснуть не менее N секунд истекло, время АКА "настенные часы" - конечно, не может быть никакой гарантии, что сон продлится точно N секунд; например, поток становится готовым к выполнению снова в это время, но он не может обязательно выгружать то, что другой поток выполняет в это время - это решение операционной системы, а не какой-либо язык программирования; с другой стороны, сон может быть преждевременно прерван различными видами событий (например, прерываниями).

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

Например, в Windows 7 QueryUnbiasedInterruptTime специально задокументировано для того, чтобы "не включать время, которое система проводит в режиме сна или гибернации" и использовать единицы по 100 наносекунд. Так что, если вы называете это, например, через ctypes вы можете достичь желаемого эффекта:

def unbiasedsleep(n):
  start = kernel32.QueryUnbiasedInterruptTime()
  target = start + n * 10 * 1000 * 1000
  while True:
    timeleft = target - kernel32.QueryUnbiasedInterruptTime()
    if timeleft > 0:
      time.sleep(timeleft / (10 * 1000 * 1000.0))

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

3 голосов
/ 13 ноября 2009

Я не знаю точно, чего вы пытаетесь достичь, но

for i in range(100):sleep(1)

может сработать, так как в спящем режиме сон будет длиться до 1 секунды

1 голос
/ 13 ноября 2009

Ясно, что вы должны спать в соответствии с реальным прошедшим временем.

Альтернатива (спать по каким-то другим часам, которые «как-то» начинались и останавливались) была бы неуправляемой.Как ваше приложение (которое находится в спящем режиме) будет уведомлено обо всех этих действиях по запуску и остановке?Правильно, его нужно было бы разбудить, чтобы сказать, что он не должен работать из-за спящего режима.

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

Все слишком сложно.

Действительно, если вы тщательно проверите, сон довольно приблизителен, и любой сигнал Unix прервет его.Поэтому можно рано вставать по многим причинам.Control-C является большим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...