【问题标题】:Execute function at specific moment with millisecond precision在特定时刻以毫秒精度执行函数
【发布时间】:2020-12-02 02:35:10
【问题描述】:

尝试在特定时间执行函数时遇到问题。

我的想法是我有一个随机时间的 while 循环,在这段时间里,我需要在随机生成的时间执行 50 毫秒的哔声,然后重新分配它(理论上可以调用1-3次)。

如何确保准确计时? 现在我用过:

random_time_loop = np.round(np.random.uniform(4,7), 3)
random_time_tone = np.round(np.random.uniform(2,3), 3)

print("Random_time: {}; random_time_tone: {}".format(random_time_loop, random_time_tone))

t_end = (datetime.datetime.now() + datetime.timedelta(seconds=random_time_loop)).time()
t_tone = (datetime.datetime.now() + datetime.timedelta(seconds=random_time_tone)).time()

print("current: "+str(datetime.datetime.now().time()))
print("t_end: "+ str(t_end))
print("t_ring: "+ str(t_tone))

while datetime.datetime.now().time() < t_end:
    if(datetime.datetime.now().time() == t_tone):
        print("Ring ring")
        print(str(datetime.datetime.now().time()) + "==" + str(t_tone))
        random_time_tone = np.round(np.random.uniform(2,3), 3)
        t_tone = (datetime.datetime.now() + datetime.timedelta(seconds=random_time_tone)).time()
        print("New tone random time: {} ringing at: {}".format(random_time_tone, t_tone))
print("ended: {}".format(datetime.datetime.now().time()))

这个实现的输出:

Random_time: 5.684; random_time_tone: 2.909
current: 12:32:36.713071
t_end: 12:32:42.397056
t_ring: 12:32:39.622069
Ring ring
12:32:39.622101==12:32:39.622069
New tone random time: 2.663 ringing at: 12:32:42.285198
ended: 12:32:42.397059

可以看出,当前时间与函数执行时间并不完全相同。此外,它计划在 *42.285198 响铃,但即使进程在 *42.397059 结束,它也没有发生。是否有可能以毫秒级的精度确保准确执行?我检查了其他一些解决方案,但其中大多数都尝试偶尔执行某些操作,并且不会在如此波动的时间范围内操作。

PS。我知道执行代码时会有一点延迟,因此 datetime.now() 可能会有所不同,尤其是在声明 t_end 和 t_tone 时(可能是一个糟糕的实现,而是使用分配给它的相同当前时间的单个“current_time”变量)。然而,在比较时间时如何确保毫秒精度。

提前谢谢你!

【问题讨论】:

    标签: python numpy datetime time


    【解决方案1】:

    在计算机“通用”操作系统中不可能做到这一点,您需要某种称为 RTOS 的操作系统,它用于嵌入式系统编程来解决这种类型的精度问题。

    如果您对此进行更多研究,您会注意到存在一种称为“定时器中断”的东西,它是一种硬件,主要功能就是这类东西。

    您需要另一种更“接近”硬件的实现方式。

    当您对微控制器进行编程时,这种类型的计数器用于定时器事件是非常常见的工作,基本上您设置一个计数器,当它设置为 0 时会执行某些操作,您可以设置毫秒、微秒等,这就是这种类型的事物用于机器人技术和其他特殊应用,例如电信。

    这是一个与普通操作系统相距甚远的不同世界,您需要了解很多关于 C 和硬件编程的知识。

    【讨论】:

    • 那么在常规操作系统上获得近毫秒精度的最佳选择是什么?如果有的话? ://
    • 在一台基本的计算机中,对于人类而言,你不知道一个事件是否与另一个事件相差毫秒,所以理论上,我很满意与秒单位的小数点 2 相比。 12:32:39.622101==12:32:39.622069 在人类感觉中几乎是同一时间,物理学中使用了一些东西,另一个主要领域称为舍入,在这种情况下你有一些错误但你假设这个数字是相等的,所以你丢弃了数字的一部分。
    • 就人类而言确实如此,但我需要使用眼动仪进行实验,因此非常需要毫秒精度。
    • 在这种情况下,通常使用缓冲区来存储数据并进行实时处理,了解多线程吗?
    • 我找到了这个,如果它适合你stackoverflow.com/questions/18169099/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多