如何在 ~100-200us 进行延迟
How to make a delay at ~100-200us
我想尝试使用 python 进行一些硬件测试。我必须向有连续字节传输时间间隔 (~100-200us) 规范的硬件发送命令。但是,我发现当延迟时间太小时,时间模块中的 sleep() 方法不稳定。有没有 way/operations 需要 ~100-200us?
我也想知道函数time()的精度是多少,它真的可以计时100us的时间间隔吗?
from time import time, sleep
a = []
start = time()
for i in range(10):
sleep(200e-6)
a.append(time()-start)
这是 'a' 的样子:
[0.0010325908660888672,
0.004021644592285156,
0.006222248077392578,
0.008239507675170898,
0.009252071380615234,
0.01157999038696289,
0.013728857040405273,
0.014998674392700195,
0.016725540161132812,
0.0187227725982666]
关于 time.sleep
的准确性
看起来time.sleep()
只有毫秒分辨率。尽管它的范围可能在几毫秒到超过 20 毫秒之间(最佳情况),但根据您使用的 OS,您似乎无法从中获得准确的微秒级睡眠执行。
参考资料
- 必看:How accurate is python's time.sleep()?
- usleep in Python
- https://github.com/JuliaLang/julia/issues/12770
- https://gist.github.com/ufechner7/1aa3e96a8a5972864cec
Another Option:
- 看看 高精度计时器,可从 winmm.lib: Creating a High-Precision, High-Resolution, and Highly Reliable Timer, Utilising Minimal CPU Resources 获得。此资源共享一些代码(可能是 C++)来创建高精度计时器(他们声称有 5% 的错误),如果精度恰好在 1 微秒的数量级,那么您可能会接受它。
- 另见此:How to make thread sleep less than a millisecond on Windows。
然后您可能会寻找围绕计时器代码创建 C/C++ 包装器 以从 Python.[=19= 使用它]
时间模块不是不稳定的,它是你运行所在的底层OS。睡觉的请求刚刚传递给OS。在 documentation 中,可以看到实际睡眠时间可能比请求的时间少,因为任何捕获的信号都会暂停睡眠,或者它可能比调度时请求的时间长 reasons.If 你需要非常高的准确性,您可以使用实时 OS.
我想尝试使用 python 进行一些硬件测试。我必须向有连续字节传输时间间隔 (~100-200us) 规范的硬件发送命令。但是,我发现当延迟时间太小时,时间模块中的 sleep() 方法不稳定。有没有 way/operations 需要 ~100-200us?
我也想知道函数time()的精度是多少,它真的可以计时100us的时间间隔吗?
from time import time, sleep
a = []
start = time()
for i in range(10):
sleep(200e-6)
a.append(time()-start)
这是 'a' 的样子:
[0.0010325908660888672,
0.004021644592285156,
0.006222248077392578,
0.008239507675170898,
0.009252071380615234,
0.01157999038696289,
0.013728857040405273,
0.014998674392700195,
0.016725540161132812,
0.0187227725982666]
关于 time.sleep
的准确性
看起来time.sleep()
只有毫秒分辨率。尽管它的范围可能在几毫秒到超过 20 毫秒之间(最佳情况),但根据您使用的 OS,您似乎无法从中获得准确的微秒级睡眠执行。
参考资料
- 必看:How accurate is python's time.sleep()?
- usleep in Python
- https://github.com/JuliaLang/julia/issues/12770
- https://gist.github.com/ufechner7/1aa3e96a8a5972864cec
Another Option:
- 看看 高精度计时器,可从 winmm.lib: Creating a High-Precision, High-Resolution, and Highly Reliable Timer, Utilising Minimal CPU Resources 获得。此资源共享一些代码(可能是 C++)来创建高精度计时器(他们声称有 5% 的错误),如果精度恰好在 1 微秒的数量级,那么您可能会接受它。
- 另见此:How to make thread sleep less than a millisecond on Windows。
然后您可能会寻找围绕计时器代码创建 C/C++ 包装器 以从 Python.[=19= 使用它]
时间模块不是不稳定的,它是你运行所在的底层OS。睡觉的请求刚刚传递给OS。在 documentation 中,可以看到实际睡眠时间可能比请求的时间少,因为任何捕获的信号都会暂停睡眠,或者它可能比调度时请求的时间长 reasons.If 你需要非常高的准确性,您可以使用实时 OS.