例如,如果我执行time.sleep(100)并立即将我的计算机休眠99秒,那么下一个语句会在唤醒后的1秒或100秒内执行吗?
如果答案是1秒,无论休眠/待机的长度如何,你怎么“睡觉”100秒?
答案 0 :(得分:5)
time.sleep(N)
尝试至少 N秒过夜,AKA“挂钟”时间 - 当然无法保证睡眠将完全 < / em> N秒;例如,线程随时准备好再次执行,但它不一定能抢占当时正在执行的其他任何线程 - 这是操作系统做出的决定,而不是任何编程语言;另一方面,睡眠可能会被各种事件(例如中断)过早地中断。
如果你可以在你的操作系统上找到一些类似时钟的东西,只有当系统的状态是你关心的状态时才会进展(例如“不是hybernated”,在你的情况下),那么当然你可以回去睡觉如果你“太早”再次醒来。
例如,在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))
我不知道如何在其他版本的Windows或其他操作系统上获得等效的QueryUnbiasedInterruptTime,但是,你不告诉我们你感兴趣的操作系统,所以它会是无论如何,提出一个可能在不同环境中工作的方法的长洗衣清单是毫无意义的。
答案 1 :(得分:3)
我不确切地知道你想要实现什么,但是
for i in range(100):sleep(1)
可能会起作用,因为休眠只会使用长达1秒的睡眠时间
答案 2 :(得分:1)
显然,你必须按照实际经过的时间睡觉。
替代方案(根据其他时钟“以某种方式”开始和停止)睡觉将是无法管理的。您的应用程序(正在休眠)如何通知所有这些启动和停止活动?是的,它必须被唤醒被告知它不应该运行,因为系统正在休眠。
或者,或许,可以使用一些超级复杂的操作系统级别调度程序来确定系统是否在某些时间“繁忙”而不是“休眠”计算各种睡眠过程的时间表。太复杂了。
事实上,如果你仔细检查,睡眠是非常近似的,任何Unix信号都会中断它。所以有很多原因可以提前醒来。 Control-C就是一个很好的例子。