python apscheduler 不一致
python apscheduler not consistent
我正在 运行使用 python apscheduler 在 web.py框架。
函数 运行server 应该 运行 每天 9 a.m 但它不一致。
大多数日子 运行 但偶尔会跳过一天。
代码:
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 点 运行 的正确方法是什么a.m?
APScheduler 有一个宽限期,在此期间允许作业运行。如果由于某种原因调度器忙 and/or 主机负载过高,APScheduler 可能无法及时启动作业。
在这种情况下,如果作业无法在宽限时间内启动,则会被丢弃(如果您已初始化 Python 日志记录,则会记录一条解释性消息)。
取决于实际根本原因:
- 如果调度程序未能及时调度作业,您可以使用
misfire_grace_time=None
告诉 APScheduler 尽快调度作业而不是丢弃它。
- 默认情况下,每个作业只允许一个实例同时运行。确保前面的 运行 已经完成。通过在添加作业时使用
max_instances
关键字参数,可以为调度程序同时允许 运行 的特定作业设置最大实例数。在这种情况下,您可能还需要使用 coalesce=False
。仅当工作需要超过 24 小时(在您的情况下)并且您接受工作的两个实例可以同时 运行ning 时才执行此操作。
- 如果 运行ning 作业太多,但机器负载不是太高,这意味着您有更多的作业可以同时 运行。您可以尝试将 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 应用程序 运行ning。我想这是粘贴的代码,并不能真正代表您 运行ning。在我看来,您应该改用像 BackgroundScheduler 这样的非阻塞调度程序。
我正在 运行使用 python apscheduler 在 web.py框架。 函数 运行server 应该 运行 每天 9 a.m 但它不一致。 大多数日子 运行 但偶尔会跳过一天。
代码:
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 点 运行 的正确方法是什么a.m?
APScheduler 有一个宽限期,在此期间允许作业运行。如果由于某种原因调度器忙 and/or 主机负载过高,APScheduler 可能无法及时启动作业。
在这种情况下,如果作业无法在宽限时间内启动,则会被丢弃(如果您已初始化 Python 日志记录,则会记录一条解释性消息)。
取决于实际根本原因:
- 如果调度程序未能及时调度作业,您可以使用
misfire_grace_time=None
告诉 APScheduler 尽快调度作业而不是丢弃它。 - 默认情况下,每个作业只允许一个实例同时运行。确保前面的 运行 已经完成。通过在添加作业时使用
max_instances
关键字参数,可以为调度程序同时允许 运行 的特定作业设置最大实例数。在这种情况下,您可能还需要使用coalesce=False
。仅当工作需要超过 24 小时(在您的情况下)并且您接受工作的两个实例可以同时 运行ning 时才执行此操作。 - 如果 运行ning 作业太多,但机器负载不是太高,这意味着您有更多的作业可以同时 运行。您可以尝试将 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 应用程序 运行ning。我想这是粘贴的代码,并不能真正代表您 运行ning。在我看来,您应该改用像 BackgroundScheduler 这样的非阻塞调度程序。