当作业同时设置为 运行 时,APScheduler 作业数次 运行

APScheduler jobs run several times when jobs are set to be run at the same time

我想使用 APScheduler 和 cron format 安排 运行 作业。

from apscheduler.schedulers.background import BackgroundScheduler

def test_func():
    print("Test job func")

scheduler = BackgroundScheduler()

today_str = datetime.today().strftime('%Y-%m-%d')
today_with_time = datetime.strptime(today_str + " " + "12:07:00", "%Y-%m-%d %H:%M:%S")

scheduler.add_job(
                test_func,
                "cron",
                id="test",
                name="test",
                day_of_week="2",
                hour=today_with_time.hour,
                minute=today_with_time.minute,
                replace_existing=False)

假设我使用两个不同的作业 ID 执行了两次。有两个作业,同时设置为 运行。对于一份工作,它 运行 如预期的那样。有了两份工作,它 运行s 4 倍。其他触发器(例如 DateTrigger)也会发生同样的情况。

请注意,这是在 Flask 应用程序中设置的。通常,该应用会调用另一个 API 来获取作业,然后一个接一个地安排它们。

编辑:我的实际应用同时获取 3 个作业并安排它们。当我获取 1 个作业而不是 3 个作业时,错误不会发生。当我有 3 个工作时,函数是 运行 9 次。有 1 个工作,它是 运行 一次。

这是因为 Flask 在调试模式下初始化了两次。

简答:app.run(调试=真,use_reloader=假)

完整答案在这里:How to stop Flask from initialising twice in Debug Mode?

原来我是个天才,每次获取作业时都初始化了一个调度程序。 :-]

所以现在,我将管理调度(并初始化调度程序)的 class 更改为单例,它按预期工作。

我遇到了类似的问题,因为在我的情况下,每当我向它添加新作业时我都会初始化调度程序。

解决方案:

create separate function or class, which initialize/call only once and use the scheduler object wherever you are using job operations eg: add, pause, resume etc

代码片段:

def initialize_scheduler():

    sched = BackgroundScheduler(daemon=False)
    job_store = MongoDBJobStore(database=db.name,
                                collection='scheduler', client=client,
                                pickle_protocol=4)
    sched.add_jobstore(jobstore=job_store, alias='mongodb')
    sched.start()

    return sched

上述 sched 变量将在任何地方使用。