python 中的 sleep() 是否足够准确?

is sleep() accurate enough in python?

我创建了一个 python 脚本来记录 PC 全天的运行时间,并在第二天将使用情况存储在数据库中。

while 1:
        time.sleep(59.9)
        # now some code that increments the up-time value by 1 minute
        # my other code here

这是暂停执行 59.9s 的时间加法器函数的蓝图(我选择 59.9s 而不是 1 分钟,因为增量值需要写入 2 个单独的文件,所以我想给出大约100ms 的时间,以便及时完成那些操作),然后将增加的值写入两个单独的文件,并继续这样做,直到系统关闭。 (这个循环的每一次迭代都意味着一分钟过去了)

我之所以选择 sleep() 而不是其他 elapsing/storing 时间方式,是因为它可以很好地应对电涌的情况,因为正在写入增加的正常运行时间每一分钟。

我知道 time.sleep() 函数在涉及到一个微妙持续时间(以毫秒或微秒为单位)的暂停时间时并不是一个精确和准确的函数。但是由于在我的代码中时间停止了大约一分钟,所以我相信睡眠函数的 deviation/inaccuracy 不会很大。

上面的脚本我已经测试了大约2个月,结果还是很不错的。

所以我想知道这是否是一种存储正常运行时间的有效方法,或者是否存在更好的方法。

你可以试试GetTickCount64函数。

示例:

import ctypes
import datetime


def uptime_in_ms():
    lib = ctypes.windll.kernel32
    return lib.GetTickCount64()

def frmt(dt):
    d = dt.days
    _s = dt.seconds
    h, rem = divmod(_s, 3600)
    m, s = divmod(rem, 60)
    return f'{d} day(s), {h:02}h:{m:02}m:{s:02}s'

if __name__ == '__main__':
    ms = uptime_in_ms()
    dt = datetime.timedelta(milliseconds=ms)
    uptime = frmt(dt)
    print(uptime)

测试:

C:\Users\User>python Desktop/get_uptime.py
1 day(s), 00h:18m:51s

备注:

  1. 支持的最低客户端 - Windows Vista
  2. 这只是一个示例,因此无法验证此库是否存在
  3. 此示例使用 f 字符串格式 - Python 3.6+