在 Python 3 中安排重复事件

新手上路,请多包涵

我正在尝试安排一个重复事件在 Python 3 中每分钟运行一次。

我看过课程 sched.scheduler 但我想知道是否还有其他方法可以做到这一点。我听说我可以为此使用多个线程,我不介意这样做。

我基本上是在请求一些 JSON 然后解析它;它的值随时间变化。

要使用 sched.scheduler 我必须创建一个循环来请求它安排 even 运行一小时:

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

# Schedule the event. THIS IS UGLY!
for i in range(60):
    scheduler.enter(3600 * i, 1, query_rate_limit, ())

scheduler.run()

还有什么其他方法可以做到这一点?

原文由 Humphrey Bogart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 478
2 个回答

您可以使用 threading.Timer ,但它也会安排一次性事件,类似于 .enter 调度程序对象的方法。

将一次性调度程序转换为周期性调度程序的正常模式(在任何语言中)是让每个事件以指定的时间间隔重新安排自己。例如,对于 sched ,我不会像你正在做的那样使用循环,而是像这样:

 def periodic(scheduler, interval, action, actionargs=()):
    scheduler.enter(interval, 1, periodic,
                    (scheduler, interval, action, actionargs))
    action(*actionargs)

并通过电话启动整个“永远的周期性时间表”

 periodic(scheduler, 3600, query_rate_limit)

或者,我可以使用 threading.Timer 而不是 scheduler.enter ,但模式非常相似。

如果您需要更精细的变化(例如,在给定时间或在特定条件下停止定期重新安排),那么使用一些额外参数并不难。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以使用 schedule 。它适用于 Python 2.7 和 3.3,并且相当轻量级:

 import schedule
import time

def job():
   print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)

while 1:
   schedule.run_pending()
   time.sleep(1)

原文由 dbader 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题