Python一直睡到没有繁忙循环的时间

时间:2017-03-28 01:52:22

标签: python performance sleep thread-sleep usleep

假设我想在Python中制作一个事件提醒。它将在启动时读取包含事件列表(会议,生日等)的文件,找出哪个是最快的,然后执行time.sleep(1e7)之类的操作。实际上,这不起作用:尝试睡眠一千万秒会产生OverflowError。好的,没问题:我们将循环调用time.sleep(2**22)。这有点不那么优雅了,但是没有充分理由每隔7周唤醒我们的流程的开销应该基本上没有影响系统性能或电池寿命,或者当他们警告我们不要打电话时sleep所有人喜欢的好东西在循环中。

但是!这不起作用!它似乎工作,除非你测试你休眠计算机时会发生什么。如果您拨打time.sleep(60)并立即休眠,然后立即重新打开电源,您会发现计算机关闭时间“不计算”;程序会很晚才醒来,即使整个休眠/唤醒事情花了不到一分钟。那么,该怎么办呢?在这种情况下,一个常见的建议似乎是一个繁忙的循环:呼叫sleep,然后当你醒来时,检查时间,看看你能承受多少睡眠。

这种方法的问题在于它会迫使你进行非常短的小睡或者非常不可靠。如果下一个事件是几个月之后(也许你只是使用事件提醒来跟踪生日),这并不意味着我们可以睡几个星期,因为我们不知道多少时间的电脑将会。可能是我们打电话给睡眠后计算机将在几分钟后休眠,并且在我们应该提醒的事件发生前一天保持关闭状态。因此,我们可能会错过几周的事件,以及其后不久发生的其他事件。

那么,什么是安全的时间?一秒肯定是安全的;事实上,一秒钟可能是矫枉过正。每十秒检查一次可能是安全的;如果有人让他们的电脑进入睡眠状态并且只在他们的提醒到期之前不到十秒就开启,我认为如果它迟到几秒钟就会抱怨太多。一分钟更可疑;对于某些事情,提醒一分钟迟到没有什么区别,对于其他人来说。例如,如果你最喜欢的电视节目是在下午4点,你的提醒设置为3:59,那么迟到一分钟是不好的;用户最好知道这可能发生,并应将提醒设置为3:58进行补偿。

但是每分钟检查时间的开销可能不可忽略。至少,它不鼓励操作系统分页python解释器并将内存赋予更值得的过程。或者,如果它确实将其分页,那么每分钟产生的额外磁盘流量可能会减慢用户尝试播放的游戏速度,从而导致完美的60 fps帧速率出现故障。

或者也许这一切都不会发生,而且我非常高估了偶尔调用sleep的效果,但仍然感觉错误而kludgy且不优雅且效率低下而且只是平淡无奇恶心。操作系统知道我已经睡了多久;这项工作从最后开始是微不足道的。我的程序在计算机休眠时没有任何线索,它不应该关心。应该有一些方法让操作系统利用其知识在适当的时候唤醒我。我对吗?实际上有这样的方式吗?如果是这样,它是什么?

0 个答案:

没有答案