我正在使用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点运行的正确方法是什么?
APScheduler具有宽限期”,在此期间允许运行作业。如果由于某种原因,调度程序很忙和/或主机的负载过高,则APScheduler可能无法及时启动作业。
在这种情况下,如果无法在宽限期内启动作业,则该作业将被丢弃(如果初始化了Python日志记录,则会记录一条说明性消息。
取决于实际的根本原因:
misfire_grace_time=None
告诉APScheduler尽快调度作业,而不是将其丢弃。max_instances
关键字参数,可以为调度程序允许并发运行的特定作业设置最大实例数。在这种情况下,您可能还需要使用coalesce=False
。仅在作业耗时超过24小时(对于您而言)且您接受作业的两个实例可以同时运行时,才执行此操作。总而言之,我首先尝试使用misfire_grace_period
:
@Nightlysched.scheduled_job('cron', hour=9, misfire_grace_time=None)
但是,正如@Alex所述,我不理解您的代码为何起作用,因为对Nightlysched.start()
的调用应阻止并阻止您的Web应用程序运行。我猜这是粘贴的代码,并不能真正代表您正在运行的代码。对我来说,您似乎应该改用像BackgroundScheduler这样的非阻塞调度程序。
@ jjmontes在上述情况下是否未将misfire_grace_time=None
设置为此处文档中所建议的内容:https://apscheduler.readthedocs.io/en/v3.2.0/userguide.html#missed-job-executions-and-coalescing
请进一步说明。