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
备注:
- 支持的最低客户端 - Windows Vista
- 这只是一个示例,因此无法验证此库是否存在
- 此示例使用 f 字符串格式 - Python 3.6+
我创建了一个 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
备注:
- 支持的最低客户端 - Windows Vista
- 这只是一个示例,因此无法验证此库是否存在
- 此示例使用 f 字符串格式 - Python 3.6+