假设我想用 Python 做一个事件提醒。它会在启动时读取一个包含事件列表(会议、生日等)的文件,找出哪个是最快的,然后执行类似time.sleep(1e7)
. 实际上,这是行不通的:尝试睡眠一千万秒会产生OverflowError
. 好的,没问题:我们会time.sleep(2**22)
循环调用。它有点不那么优雅,但是每 7 周无缘无故地唤醒我们的进程的开销应该基本上不会影响系统性能或电池寿命,或者当他们警告我们不要sleep
循环调用时,每个人都喜欢的所有这些好东西。
但!这不行!它似乎有效,除非您测试休眠计算机时会发生什么。如果你打电话time.sleep(60)
马上休眠,然后马上重新开机,你会发现电脑关机的时间“不算”;即使整个休眠/唤醒时间不到一分钟,程序也会迟到。那么,该怎么办呢?在这种情况下,一个常见的建议似乎是一个繁忙的循环:打电话sleep
,然后当你醒来时,检查时间,看看你还能承受多少睡眠。
这种方法的问题在于它会迫使你小睡很短,否则就会非常不可靠。如果下一个事件是几个月之后(也许你只是使用事件提醒来跟踪生日),这并不意味着我们可以睡几个星期,因为我们不知道电脑有多少时间将开启。可能在我们调用睡眠后几分钟,计算机就会进入休眠状态,并一直保持关闭状态,直到我们应该提醒的事件发生前一天。因此,我们可能会错过几周的活动,以及之后不久的任何其他活动。
那么,什么是安全时间?一秒钟肯定是安全的;事实上,一秒钟可能是矫枉过正。每十秒钟检查一次可能是安全的;如果有人让他们的电脑进入睡眠状态,并且在他们的提醒到期前不到十秒才打开它,我认为如果它迟到了几秒钟,他们就不会抱怨太多。一分钟更可疑;对于某些事情,迟到一分钟被提醒几乎没有什么不同,但对于其他事情却是这样。例如,如果您最喜欢的电视节目是下午 4 点,而您的提醒设置为 3:59,那么迟到一分钟是不好的;用户最好知道这可能会发生,并且应该将提醒设置为 3:58 以进行补偿。
但是每分钟检查一次时间的开销可能是不可忽略的。至少,它不鼓励操作系统分页 python 解释器并将内存分配给更值得的进程。或者,如果它确实将其分页,那么每分钟产生的额外磁盘流量可能会减慢用户尝试玩的游戏,从而导致原本完美的 60 fps 帧速率出现故障。
或者也许这一切都不会发生,我严重高估了偶尔打电话的影响sleep
,但仍然感觉不对劲、笨拙、不优雅、效率低下,而且很恶心。操作系统知道我睡了多久;这项工作从头到尾都是微不足道的。我的程序不知道计算机何时休眠,它不应该关心。应该有某种方法让操作系统使用它的知识在正确的时间唤醒我。我对吗?真的有这样的方法吗?如果是这样,那是什么?