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 или других операционных системах, но тогда вы не скажете нам, какие операционные системы вам интересны, так что это будет В любом случае, довольно бессмысленно представлять длинный список подходов, которые могут работать одинаково в разных условиях.