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

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

我在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”接口的接口(在sched case中,.enter).如果你想安排事情 – 使用“run_at”(在你的情况下为.enterabs).顺便说一句,考虑到你在python中只有一个进程,你仍然可以“迟到”,但这不是你可以影响的东西.

旁注:您很少需要重新定义调度程序计时器,默认值很好,它使用time.monotonic并且回退到time.time.如果您的代码能够实现真实世界的使用,Monotonic将为您免受意外的痛苦.

点赞