【问题标题】:How to manage a task queue using APScheduler?如何使用 APScheduler 管理任务队列?
【发布时间】:2021-01-12 18:38:34
【问题描述】:

我想使用 APScheduler 来处理任务调度和队列。 我目前正在使用非常基本的 APScheduler 设置:BackgroundScheduler() 我知道如何启动调度程序并在间隔触发作业上设置一些 cron。 但我不知道如何处理正确的队列。

这是我的代码:

from apscheduler.schedulers.background import BackgroundScheduler


scheduler = BackgroundScheduler()

def test():
    print("Hello World !")

def start_job():
    scheduler.add_job(
        test
    )

start_job() # first task
start_job() # second task
start_job() # third task

scheduler.start()

这种代码可以工作,但我需要我的任务一个接一个地运行,而不是同时运行。

我尝试过使用max_instances 属性,但它并没有改变任何东西。

我还尝试将id 添加到我的工作中,然后只启动第一个任务,而不是左侧的任务,给出这些警告: Execution of job "test (trigger: date[2021-01-12 17:55:48 UTC], next run at: 2021-01-12 17:55:48 UTC)" skipped: maximum number of running instances reached (1)

我应该如何开始剩下的任务?

【问题讨论】:

    标签: python apscheduler


    【解决方案1】:

    您选择的执行器决定了作业的执行方式——是并行执行还是顺序执行。如果您不想要任何并行性,可以使用 ThreadPoolExecutormax_workers=1 来运行它们。

    【讨论】:

    • 所以我目前正在做一些测试,我明白你的意思。但是当我达到占用的最大工人数量时,我有这个警告:Run time of job "<lambda> (trigger: date[2021-01-20 16:36:40 UTC], next run at: 2021-01-20 16:36:40 UTC)" was missed by 0:00:10.003808 即使所有工人都完成了,剩下的工作也没有处理。我错过了什么?
    • 如果您打算使用 apscheduler 作为任务队列,您应该通过设置misfire_grace_time=None 禁用作业截止日期检查。不过话说回来,直接用ThreadPoolExecutor什么的不是更方便吗?
    • 所以你的意思是使用 Python ThreadPoolExecutor,而不是 the one provided by APScheduler
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多