我正在 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 可能无法及时启 Action 业。
在这种情况下,如果在宽限期内无法启动该作业,则该作业将被丢弃(如果您已初始化 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 这样的非阻塞调度程序。关于python apscheduler不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34896705/