【发布时间】:2017-05-10 12:19:36
【问题描述】:
我目前正在尝试每 10 毫秒调用一次函数以从传感器获取数据。
基本上,我是从 gpio 中断触发回调,但我更换了传感器,而我当前使用的传感器没有 INT 引脚来驱动回调。
所以我的目标是具有相同的行为,但由计时器生成内部中断。
我从这个topic尝试过这个
import threading
def work ():
threading.Timer(0.25, work).start ()
print(time.time())
print "stackoverflow"
work ()
但是当我运行它时,我可以看到计时器并不是很精确,而且正如你所见,它是随着时间推导的。
1494418413.1584847
stackoverflow
1494418413.1686869
stackoverflow
1494418413.1788757
stackoverflow
1494418413.1890721
stackoverflow
1494418413.1992736
stackoverflow
1494418413.2094712
stackoverflow
1494418413.2196639
stackoverflow
1494418413.2298684
stackoverflow
1494418413.2400634
stackoverflow
1494418413.2502584
stackoverflow
1494418413.2604961
stackoverflow
1494418413.270702
stackoverflow
1494418413.2808678
stackoverflow
1494418413.2910736
stackoverflow
1494418413.301277
stackoverflow
所以计时器每 10 毫秒推导 0.2 毫秒,这在几秒钟后是一个很大的偏差。
我知道 python 并不是真正为“实时”而设计的,但我认为应该有办法做到这一点。
如果有人已经不得不使用 python 处理时间限制,我很乐意提供一些建议。
谢谢。
【问题讨论】:
-
它正在漂移,因为您没有考虑到计时器本身所花费的时间和打印时间。如果您将计时器基于实际时间与下一个 10 毫秒到期时间之间的差异,那么您的时间将不会漂移。例如,在开始循环之前获取时间并保持“目标”以 10 毫秒的增量增加,并启动定时器一段时间 (target-currenttime),然后当定时器到期时,将 10 毫秒添加到目标并重新启动.您需要自己确认您得到的抖动是否可以接受 - 即在所有使用场景下测量平均值和峰值
-
感谢您的回答,我知道我没有测量计时器的时间安排,但我虽然它不会增加这样的漂移。我的意思是我想在这 10 毫秒内非常精确,这种方法的问题是我总是会从计时器的调度中产生偏差。
-
有没有办法在开始时只定义一次并让计时器在到期后自动重新启动?
-
使用我建议的方法,会有 10 毫秒间隔的抖动,但没有漂移,因为在每次超时时,计时器都会以适当的延迟启动,减去之前的抖动。当然,你完全可以随心所欲地做这件事——为什么不做一些实验,想出一个更好的方案呢?
-
我尝试了你的方法,但要么我不明白你说什么,要么我的代码有问题。如果你能看一下,也许你会明白我做错了什么
标签: python multithreading timer raspberry-pi periodic-task