gpt4 book ai didi

Python sched.scheduler 超过最大递归深度

转载 作者:太空狗 更新时间:2023-10-30 00:47:03 30 4
gpt4 key购买 nike

我最近开始学习 Python,我正在制作的简单应用程序的一部分包括一个在其自己的线程中运行的带有 hh:mm:ss 显示的计时器。

环顾网络,我发现了两种实现方法:

  1. 使用 sched.scheduler
  2. 使用 threading.Timer

两种实现方式看起来很相似:

计划:

def tick(self, display, alarm_time):

# Schedule this function to run every minute
s = sched.scheduler(time.time, time.sleep)
s.enter(1, 1, self.tick, ([display, alarm_time]))

# Update the time
self.updateTime(display)

计时器:

def tick(self, display):

# Schedule this function to run every second
t = Timer(1, self.tick, (display,alarm_time))
t.start()

# Update the time
self.updateTime(display)
  1. 在正确计时方面工作正常,但几分钟后生成以下错误:RuntimeError:超出最大递归深度。我知道您可以手动增加最大递归级别,但这里肯定没有必要这样做吧?

  2. 没有错误,但偶尔会跳秒,或不规则滴答。

有人可以指出正确的方向,告诉我如何正确地做到这一点吗?谢谢。

最佳答案

以下是如何将一次性事件变成周期性事件,例如with sched:如果函数必须创建自己的调度程序并且是唯一在其线程上运行的东西:

def tick(self, display, alarm_time, scheduler=None):
# make a new scheduler only once & schedule this function immediately
if scheduler is None:
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.enter(0, 1, self.tick, ([display, alarm_time, scheduler]))
scheduler.run()

# reschedule this function to run again in a minute
scheduler.enter(1, 1, self.tick, (display, alarm_time, scheduler]))

# do whatever actual work this function requires, e.g.:
self.updateTime(display)

如果其他事件也必须在同一个线程中安排,那么调度程序必须在“其他地方”创建和拥有——上面的 if 部分可以重构为另一个方法,例如:

def scheduleperiodic(self, method, *args):
self.scheduler = sched.scheduler(time.time, time.sleep)
self.scheduler.enter(0, 1, method, args)
# whatever else needs to be scheduled at start, if any, can go here
self.scheduler.run()

def tick(self, display, alarm_time):
# reschedule this function to run again in a minute
self.scheduler.enter(60, 1, self.tick, (display, alarm_time))

# do whatever actual work this function requires, e.g.:
self.updateTime(display)

同样,当然和 sched 一样,当调度器运行时,它(和调度的事件回调)将“接管”相关线程(因此您需要如果您需要同时发生其他事情,请为其创建一个单独的线程。

如果您需要在许多函数中使用这种习语,可以将其重构为装饰器,但这会在某种程度上掩盖习语的基本简单性,所以我更喜欢这种简单、公开的用法。顺便说一句,请注意 time.time 和 time.sleep 使用秒而不是分钟作为时间单位,因此您需要 60 而不是一分钟来表示“从现在开始一分钟”;-)。

关于Python sched.scheduler 超过最大递归深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404580/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com