【问题标题】:python apscheduler not consistentpython apscheduler不一致
【发布时间】:2016-04-26 02:26:43
【问题描述】:

我在 web.py 框架内使用 python apscheduler 运行调度程序。 runserver 函数应该在每天上午 9 点运行,但它并不一致。 它大部分时间都会运行,但偶尔会跳过一天。

代码:

import web
from apscheduler.schedulers.blocking import BlockingScheduler #Blocking Scheduler

#URLs
urls = (
    '/startscheduler/','index',
    )

Nightlysched = BlockingScheduler()

@Nightlysched.scheduled_job('cron', hour=9)
def runserver():
    print 2+2 #doing some calculations here

#Main function to run the cron JOB
if __name__ == "__main__":
    Nightlysched.start() #stating the job
    app = web.application(urls, globals())
    app.run() 

将调度程序配置为每天上午 9 点运行的正确方法是什么?

【问题讨论】:

  • 我完全无法理解这段代码是如何工作的。 Nightlysched.start() 将阻止并且不让您的网络应用程序运行。也就是说,配置是正确的。请启用调试日志记录(将“apscheduler”的日志级别设置为 DEBUG)以了解发生了什么。
  • 在调度程序启动 (Nightlysched.start()) 后,它会按预期运行 Web 应用程序。你能告诉我如何设置 apscheduler 的日志级别吗?我尝试了几件事,但没有奏效。谢谢

标签: python scheduler blocking web.py apscheduler


【解决方案1】:

APScheduler 有一个宽限期,在此期间允许作业运行。如果由于某种原因调度程序很忙和/或主机的负载太高,APScheduler 可能无法及时启动作业。

在这种情况下,如果在宽限期内无法启动该作业,则该作业将被丢弃(如果您已初始化 Python 日志记录,则会记录一条解释性消息)。

取决于实际的根本原因:

  • 如果调度程序未能及时安排作业,您可以使用misfire_grace_time=None 告诉 APScheduler 尽快安排作业而不是丢弃它。
  • 默认情况下,每个作业只允许一个实例同时运行。确保上一次运行已完成。通过在添加作业时使用 max_instances 关键字参数,可以为调度程序允许并发运行的特定作业设置最大实例数。在这种情况下,您可能还需要使用coalesce=False。仅当作业需要超过 24 小时(在您的情况下)并且您接受您的作业的两个实例可以同时运行时才执行此操作。
  • 如果运行的作业太多,但机器负载不是太高,这意味着您的作业多于可以同时运行的作业。您可以尝试增加 APScheduler executor 用于运行作业的线程池的大小(这取决于您的设置,检查:http://apscheduler.readthedocs.org/en/latest/userguide.html)。

总之,我会先尝试misfire_grace_period

@Nightlysched.scheduled_job('cron', hour=9, misfire_grace_time=None)

不过,请注意,正如@Alex 提到的,我不明白您的代码为何有效,因为对Nightlysched.start() 的调用应该会阻塞并阻止您的 Web 应用程序运行。我猜这是粘贴的代码,并不能真正代表您正在运行的内容。对我来说,看起来你应该使用像 BackgroundScheduler 这样的非阻塞调度程序。

【讨论】:

  • 感谢 jjmontes 的详细解释。我会试试这个。此外,我还认为后台调度程序是一个更好的选择,但无法在每天 9 点使用后台调度程序安排作业。我能找到的所有示例都是间隔配置的,例如 scheduler.add_job(runfunction, 'interval', minutes= 15) 。你能告诉我如何将时间间隔转换为每日一小时的 cron 吗?
  • 试试scheduler.add_job(your_function, trigger='cron', hour=9, misfire_grace_time=None)。触发器参数可以是“date”、“interval”或“c​​ron”,或者您甚至可以实现自己的触发器类(我从来不需要这样做;))。
  • 另外,看看source code and doc of add_job,我发现它很有用!
  • 谢谢。我认为它现在运行良好。将不得不再测试几天)
  • @jjmontes - 非常感谢!你的解释很简单,很有帮助。我会要求亚历克斯在 apscheduler 文档中添加您的解释。(即使它在那里;))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多