python apscheduler不一致

ash*_*hen 3 python scheduler blocking web.py apscheduler

我正在使用调度蟒蛇 apscheduler内web.py框架。该功能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() 
Run Code Online (Sandbox Code Playgroud)

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

jjm*_*tes 10

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

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

根据实际的根本原因:

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

总之,我首先尝试misfire_grace_period:

@Nightlysched.scheduled_job('cron', hour=9, misfire_grace_time=None)
Run Code Online (Sandbox Code Playgroud)

不过,请注意,正如@Alex所述,我不理解您的代码为何起作用,因为对的调用Nightlysched.start()应阻止并阻止您的Web应用程序运行。我想这是粘贴的代码,并不能真正代表您正在运行的代码。在我看来,您应该改为使用像BackgroundScheduler这样的非阻塞调度程序。

  • 感谢 jjmontes 的详细解释。我会尝试一下。另外,我还认为后台调度程序是一个更好的选择,但无法每天 9 点使用后台调度程序安排作业。我能找到的所有示例都是间隔配置的,例如 Scheduler.add_job(runfunction, 'interval', 分钟= 15)。你能告诉我如何将时间间隔转换为每日一小时的 cron 吗? (2认同)