更准确的 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 中的短(毫秒)延迟? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python的time.sleep()有多准确?

Python time.sleep 与忙等待的准确性

Python time.sleep 需要更长的时间

Python - time.sleep 的替代品

Python 的 time.sleep()

Python 的 time.sleep()