更准确的 time.sleep 用于 Python 3 中的短(毫秒)延迟? [复制]
Posted
技术标签:
【中文标题】更准确的 time.sleep 用于 Python 3 中的短(毫秒)延迟? [复制]【英文标题】:More accurate time.sleep for short (millisecond) delays in Python 3? [duplicate] 【发布时间】:2021-08-07 11:03:24 【问题描述】:考虑这个例子:
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 在毫秒分辨率下更正确地睡眠 - 或者缺乏这种方法,我可以使用方法或库来获得更准确的睡眠吗?
【问题讨论】:
我的反问是:为什么需要准确的睡眠?如果您尝试在 Windows 上实现通常只能在实时操作系统上实现的目标,那么您的日子会很糟糕。 谢谢@Sid - 是的,就是这样 【参考方案1】:就更准确的时间而言,您是否考虑过使用datetime.datetime.now()
?
据我了解,datetime
使用系统时间,这可能是你能得到的最好的时间。然后,您可以创建一个 timedelta
对象并访问其上的毫秒数。
ts1 = datetime.datetime.now()
time.sleep(sleep_time_sec)
ts2 = datetime.datetime.now()
delta = ts2 - ts1 # type: datetime.timedelta
编辑:删除了第一位,因为我误读了问题
【讨论】:
以上是关于更准确的 time.sleep 用于 Python 3 中的短(毫秒)延迟? [复制]的主要内容,如果未能解决你的问题,请参考以下文章