gpt4 book ai didi

python apscheduler不一致

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:10 29 4
gpt4 key购买 nike

我正在 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 业。

在这种情况下,如果在宽限期内无法启 Action 业,作业将被丢弃(如果您已初始化 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 这样的非阻塞调度程序。

关于python apscheduler不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34896705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com