Python:为什么事件调度程序一直在漂移,有没有办法解决这个问题?

标签 python precision scheduler timing

我想在秒表的 tkinter GUI 中使用调度程序。我不确定这是否比使用后台线程更好,但我读到你不应该停止线程,而我想不断地启动和停止一个函数。

我在 Python 2.7 中做了一小段代码来测试调度程序,它似乎立即开始漂移。我希望它每秒增加一个计数器,但一分钟后我就差了两秒(62 秒过去了,而不是 60 秒)。

这台机器有关系吗?我的代码有问题吗?我应该使用另一个库吗?

import sched, time

class Scheduler_Test:
    def __init__(self):
        self.counter = 0
        self.time_increment = 1.0

        self.end_time = 0.0

        self.s = sched.scheduler(time.time, time.sleep)

        self.start_time = time.time()
        self.s.enter(self.time_increment, 1, self.do_something, (self.s,))

        self.s.run() # run the event scheduler

    #Simple test of printing out the computer time (sec) and count
    def do_something(self, random_kwarg): 
        print "Time (sec):",time.time(),", count:", self.counter
        self.event = self.s.enter(self.time_increment, 1, self.do_something, (random_kwarg,))

        self.counter = self.counter + 1

Test = Scheduler_Test()

最佳答案

如果您的目标是在长距离上跟上实际时间,请不要使用延迟。

总是会有延迟,最终你会下类,原因是——在事件开始和新事件调度之间有非零的 CPU 工作,而且你总是有任务优先级。

因此,如果您想要延迟 — 使用带有“run_after”接口(interface)的接口(interface)(在 sched 情况下,.enter)。如果你想安排事情——使用“run_at”(在你的例子中是.enterabs)。顺便说一句,考虑到您在 Python 中只有一个进程,您仍然“迟到”,但这不是您可以影响的事情。

旁注:您很少想重新定义调度程序计时器,默认值很好,它使用 time.monotonic 并回退到 time.time。如果您的代码将在现实世界中使用,Monotonic 将使您免于意想不到的痛苦。

关于Python:为什么事件调度程序一直在漂移,有没有办法解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52930192/

相关文章:

python - 从 R 或 Python 中的列中获取经常出现的字符串模式

java - 为什么在 Java 中存储为 float 和 double 的相同值之间存在差异?

ios - 如何在 Swift 中仅打印 2 位数字而不四舍五入?

security - 在不提供密码的情况下模拟 Windows 本地用户帐户的 api 是什么?

C: freeRTOS 没有按预期工作

python - PyDev 控制台工作目录

python - 返回列表中正数或负数元素的函数

python - Django 值列表与值

c - 如何检查 Double 中的浮点精度

scheduler - AutoSys 调度程序更新 JIL