如何解决更准确的 time.sleep 在 Python 3 中的短毫秒延迟?
考虑这个例子:
import sys,os
import time
sleep_time_ms = 1
numrepeats = 10
for sleep_time_ms in [1,5,10,50,100,500]:
sleep_time_sec = sleep_time_ms/1000
total_sleep_time_ms = numrepeats*sleep_time_ms
total_sleep_time_sec = total_sleep_time_ms/1000
print("sleep time {} ms ({} sec),numrepeats 10 -> expected total sleep time {} ms ({} sec)".format(sleep_time_ms,sleep_time_sec,total_sleep_time_ms,total_sleep_time_sec) )
ts1 = time.time()
for ix in range(numrepeats):
time.sleep(sleep_time_sec)
ts2 = time.time()
print(" ... -> elapsed time {} sec".format(ts2-ts1))
以下是在 Windows 10 上安装 MSYS2 的 MINGW64 bash
shell 中 Python 3.8.9 的结果:
sleep time 1 ms (0.001 sec),numrepeats 10 -> expected total sleep time 10 ms (0.01 sec)
... -> elapsed time 0.15603327751159668 sec
sleep time 5 ms (0.005 sec),numrepeats 10 -> expected total sleep time 50 ms (0.05 sec)
... -> elapsed time 0.15575146675109863 sec
sleep time 10 ms (0.01 sec),numrepeats 10 -> expected total sleep time 100 ms (0.1 sec)
... -> elapsed time 0.15668964385986328 sec
sleep time 50 ms (0.05 sec),numrepeats 10 -> expected total sleep time 500 ms (0.5 sec)
... -> elapsed time 0.627091646194458 sec
sleep time 100 ms (0.1 sec),numrepeats 10 -> expected total sleep time 1000 ms (1.0 sec)
... -> elapsed time 1.09147310256958 sec
sleep time 500 ms (0.5 sec),numrepeats 10 -> expected total sleep time 5000 ms (5.0 sec)
... -> elapsed time 5.045071840286255 sec
... 以及适用于 Windows 10 上 Anaconda 中的 Python 3.7.3:
sleep time 1 ms (0.001 sec),numrepeats 10 -> expected total sleep time 10 ms (0.01 sec)
... -> elapsed time 0.1423649787902832 sec
sleep time 5 ms (0.005 sec),numrepeats 10 -> expected total sleep time 50 ms (0.05 sec)
... -> elapsed time 0.15515851974487305 sec
sleep time 10 ms (0.01 sec),numrepeats 10 -> expected total sleep time 100 ms (0.1 sec)
... -> elapsed time 0.15677261352539062 sec
sleep time 50 ms (0.05 sec),numrepeats 10 -> expected total sleep time 500 ms (0.5 sec)
... -> elapsed time 0.6259005069732666 sec
sleep time 100 ms (0.1 sec),numrepeats 10 -> expected total sleep time 1000 ms (1.0 sec)
... -> elapsed time 1.088958978652954 sec
sleep time 500 ms (0.5 sec),numrepeats 10 -> expected total sleep time 5000 ms (5.0 sec)
... -> elapsed time 5.065780878067017 sec
因此,对于低(毫秒)睡眠时间,实际睡眠时间与所需睡眠时间存在较大偏差;第一次它的接近是在大约 50 毫秒的睡眠时间,然后对于更长的睡眠时间就可以了。实际上,这里的系统似乎在 15 毫秒左右达到了低阈值睡眠时间分辨率。
我的问题是 - 有没有办法让 time.sleep 以毫秒分辨率更正确地进入睡眠状态 - 或者缺乏这种方法,是否有一种方法或库可以用于更准确的睡眠?
解决方法
就更准确的时间而言,您是否考虑过使用 datetime.datetime.now()
?
据我所知,datetime
使用系统时间,这可能是您获得的最佳时间。然后,您可以创建一个 timedelta
对象并访问其上的毫秒数。
ts1 = datetime.datetime.now()
time.sleep(sleep_time_sec)
ts2 = datetime.datetime.now()
delta = ts2 - ts1 # type: datetime.timedelta
编辑:删除了第一位,因为我误读了问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。