我有一个调度函数和一个调度程序,其中包含按时间排序的 future 事件队列。我使用的是 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 = 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()
专为您需要以设定的间隔做事而不管任何事情的情况而设计 - 因此,如果您的解决方案预计会根据新系统时间早晚运行计划任务来对时间跳跃使用react,那么您没有理由使用单调时间。强>
如果您想两者,那么您要么需要两个调度程序,要么需要具有两种时间戳的任务。
在后一种情况下,调度程序需要将一种类型转换为另一种类型(每次它计算要等待多少时间/是否运行下一个任务)- 为此 time
没有办法。
关于python - 安排具有单调时间的精确时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46903195/