Python 检查时间间隔(在1、2、3、10 毫秒内执行操作)
Python check time interval (perform actions in 1, 2, 3, 10 milliseconds)
我想检查事件何时发生,做一组间隔特定时间的动作。
if (volt>3):
oldtime=curtime
curtime = t
diff = curtime-oldtime
if time.time == curtime + (difference/3):
do something
temptime=curtime+(difference/3)
if time.time == curtime+(temptime+(difference/10):
do something
temptime == (temptime+(difference/10)
if .... etc
所以每当我的电压达到阈值时,我想发送一系列具有非常特定时间的事件。我很确定它现在的设置方式既不高效也不准确。我正在将数据流式传输到图表中,不想在等待这些时间间隔时暂停(并且大约每 10 毫秒检查一次电压。
我不确定用什么来代替 if 语句,让它充当 when time.time = timeWanted: do thing
我还需要为此进行多线程处理吗? (还没体验过)
根据研究,我发现 windows 使用计时器只能精确到 10 毫秒。我应该考虑 运行 使用不同的 OS 还是使用不同的语言?
如果你真的需要准确的计时,我强烈建议使用没有垃圾收集的语言,比如 C 或 C++。但是,如果您可以容忍与精确栅格的一些偏差,那么 Python 可能会很好。
关于time.time的分辨率,请查看文档中的相应页面。 Windows 和 Linux 是有区别的。对于后者,time.time() 具有更高的分辨率,对于 Windows 应该是 time.clock()。后者我无法确认,因为我没有可用的 Windows 框。
无论如何,最好使用 threading/multiprocessing 框架,因为 CPU 在轮询时隙时会非常忙。
啊,我建议只获取一次 time() 并与一些公差进行比较。否则你最终会失去时隙。一个好的技术是计算下一个时隙的时间并比较 time() <= next_slot。这样,即使你错过了准确的时间,你也会在不久之后最终命中。
编辑:
您需要为每个间隔单独维护下一个时隙。另外,为避免长期偏差,请使用绝对时间,而不是增量:
curr_time = time.time()
if curr_time >= interval1_next_time:
interval1_next_time += INTERVAL1_TSLOT
if curr_time >= interval1_next_time:
# we lost a full timeslot, so slowly adjust (can also report)
interval1_next_time += INTERVAL1_TSLOT
....
if curr_time >= interval2_next_time:
interval2_next_time += INTERVAL2_TSLOT
....
你说你正在流式传输到一个图表。如果您每秒更新图表 5-10 次左右,对于人类观察者来说它看起来几乎是连续的。所以我会考虑这种可能性:您的图形环境可能有某种计时器滴答,如果没有,您可能会查看标准库 threading.Timer。当数据点到达时,您立即将其添加到数据缓冲区。但是您只在计时器触发时更新图表。您永远不必担心丢失任何数据。我一直在做这种事情,而且在实践中效果很好。
我想检查事件何时发生,做一组间隔特定时间的动作。
if (volt>3):
oldtime=curtime
curtime = t
diff = curtime-oldtime
if time.time == curtime + (difference/3):
do something
temptime=curtime+(difference/3)
if time.time == curtime+(temptime+(difference/10):
do something
temptime == (temptime+(difference/10)
if .... etc
所以每当我的电压达到阈值时,我想发送一系列具有非常特定时间的事件。我很确定它现在的设置方式既不高效也不准确。我正在将数据流式传输到图表中,不想在等待这些时间间隔时暂停(并且大约每 10 毫秒检查一次电压。
我不确定用什么来代替 if 语句,让它充当 when time.time = timeWanted: do thing
我还需要为此进行多线程处理吗? (还没体验过)
根据研究,我发现 windows 使用计时器只能精确到 10 毫秒。我应该考虑 运行 使用不同的 OS 还是使用不同的语言?
如果你真的需要准确的计时,我强烈建议使用没有垃圾收集的语言,比如 C 或 C++。但是,如果您可以容忍与精确栅格的一些偏差,那么 Python 可能会很好。
关于time.time的分辨率,请查看文档中的相应页面。 Windows 和 Linux 是有区别的。对于后者,time.time() 具有更高的分辨率,对于 Windows 应该是 time.clock()。后者我无法确认,因为我没有可用的 Windows 框。
无论如何,最好使用 threading/multiprocessing 框架,因为 CPU 在轮询时隙时会非常忙。
啊,我建议只获取一次 time() 并与一些公差进行比较。否则你最终会失去时隙。一个好的技术是计算下一个时隙的时间并比较 time() <= next_slot。这样,即使你错过了准确的时间,你也会在不久之后最终命中。
编辑: 您需要为每个间隔单独维护下一个时隙。另外,为避免长期偏差,请使用绝对时间,而不是增量:
curr_time = time.time()
if curr_time >= interval1_next_time:
interval1_next_time += INTERVAL1_TSLOT
if curr_time >= interval1_next_time:
# we lost a full timeslot, so slowly adjust (can also report)
interval1_next_time += INTERVAL1_TSLOT
....
if curr_time >= interval2_next_time:
interval2_next_time += INTERVAL2_TSLOT
....
你说你正在流式传输到一个图表。如果您每秒更新图表 5-10 次左右,对于人类观察者来说它看起来几乎是连续的。所以我会考虑这种可能性:您的图形环境可能有某种计时器滴答,如果没有,您可能会查看标准库 threading.Timer。当数据点到达时,您立即将其添加到数据缓冲区。但是您只在计时器触发时更新图表。您永远不必担心丢失任何数据。我一直在做这种事情,而且在实践中效果很好。