【问题标题】:scheduling for an exact time with monotonic time用单调时间安排一个准确的时间
【发布时间】:2017-10-24 06:00:12
【问题描述】:

我有一个调度函数和一个调度程序,其中包含按时间排序的未来事件队列。我正在使用 UNIX 时间戳和常规的 time.time()。调度器的一个片段大致相当于这个:

# select the nearest event (eventfunc at eventime)
sleeptime = eventtime - time.time()
# if the sleep gets interrupted,
# the whole block will be restarted
interruptible_sleep(sleeptime)
eventfunc()

eventtime 可以基于延迟计算:

eventtime = time.time() + delay_seconds

或基于确切的日期和时间,例如:

eventtime = datetime(year,month,day,hour,min).timestamp()

现在我们有了 Python 中的单调时间。我正在考虑修改调度程序以使用单调时间。调度程序应该使用他们所说的单调时间。

延迟没问题:

sleeptime = eventtime - time.monotonic()

地点:

eventtime = time.monotonic() + delay_seconds

但我认为最好的方法是让代码保持原样。对吗?

如果是,我需要两个事件队列,一个基于单调时间,一个基于常规时间。我不太喜欢这个主意。

【问题讨论】:

  • 你不妨看看sched standard module。它被设计为独立于时间操作后端,默认使用time.monotonic

标签: python time


【解决方案1】:

正如我在评论中所说,您的代码复制了 sched standard module 的功能 - 因此您也可以将解决此问题作为迁移到它的方便借口。

也就是说,

  • 如果系统时间向前或向后跳跃,您应该做什么是特定于任务的。
  • time.monotonic() 专为需要在它们之间设置间隔的情况而设计,而不管任何事情
  • 因此,如果您的解决方案预计会根据新的系统时间提前或推迟运行计划任务来对时间跳跃做出反应,那么您没有理由使用单调时间。强>

如果您希望两者都做,那么您要么需要两个调度程序,要么需要具有两种时间戳的任务。

在后一种情况下,调度程序需要将一种类型转换为另一种类型(每次它计算等待多少/是否运行下一个任务)-time 没有提供任何方法。

【讨论】:

  • 我的程序只假设 NTP 配置良好,即服务器有准确的时间而没有跳转。但是,为这种情况提供更强大的解决方案总是好的。这就是为什么我正在研究单调时钟的利弊。你没有直接回答我的问题。是否需要两个事件队列才能利用调度程序中的单调时钟?一个队列 - 用于延迟、间隔等 - 使用 time.monotonic 和另一个队列 - 用于在确切的日期/时间进行调度 - 使用 time.time?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多