【问题标题】:Realtime scheduling repeated events in nanoseconds以纳秒级实时调度重复事件
【发布时间】:2020-08-10 14:30:56
【问题描述】:

我需要在 Python 中创建一个实时调度程序,它每 n 纳秒执行一个简单的函数。

我尝试通过sched 模块创建调度程序并将time.time_ns 指定为timefunction,但在尝试使用延迟函数来安排比几秒更精细的等待时出现错误。

这是我正在执行的代码:

import sched
import time

def scheduledPrint():
    print("ScheduledPrinter!")

def run():
    print("Starting")
    # Create an internal scheduler
    scheduler=sched.scheduler(timefunc=time.monotonic_ns, delayfunc=time.sleep)
    exectime=time.time_ns() + 100;
    schedevent=scheduler.enterabs(exectime, 1, 'scheduledPrint')
    scheduler.run();
    
run()

当我运行上面的代码时,我得到以下错误

    delayfunc(time - now)
OverflowError: timestamp too large to convert to C _PyTime_t

Python 调度程序的最佳精度是多少?

【问题讨论】:

  • schedulertimefuncdelayfunc 必须使用相同的时间单位 - 您在这里尝试混合使用纳秒和秒。无论如何,我认为您不太了解一纳秒有多短 - 仅设置对 scheduler.run() 的调用就会超过 100 纳秒,执行准时是不可能的。
  • @jasonharper 感谢您的评论,我向您保证我知道一纳秒有多短,实际上我正在尝试评估 Python 是否可以提供具有相同分辨率的默认调度程序。如果 python 的 sleep 函数的最佳分辨率是一秒,那么我可能只能每秒执行一个调用,1Hz,这将判定 Python 不适合我的测试用例。

标签: python python-3.x time scheduler


【解决方案1】:

我相信 CPython pytime 使用 64 位有符号整数来存储“时间长度”。因此,“允许”的最大数量是9223372036.854775

您可以使用以下方法对此进行验证:

import time
time.sleep(9223372036.854775) # this works
time.sleep(9223372036.854775 + 1) # OverflowError (same with adding 0.1, or 0.01, etc)

后者将导致OverflowError

OverflowError: timestamp too large to convert to C _PyTime_t

在您的情况下,time.time_ns() 返回的值大于9223372036.854775,因此出现错误。

无论如何,以纳秒级的时间执行事件似乎相当雄心勃勃,因为 CPU 通常会以微秒级执行代码。

【讨论】:

  • 感谢您的输入,我确实发现我的错误在于使用 time_ns() 作为时间函数,尤其是使用绝对时间而不是 enterabs 函数的相对时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 2023-03-17
  • 2020-02-02
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多