【问题标题】:APScheduler jobs run several times when jobs are set to be run at the same time当作业设置为同时运行时,APScheduler 作业会运行多次
【发布时间】:2018-09-28 12:44:34
【问题描述】:

我想使用 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。有两个作业,设置为同时运行。对于一项工作,它按预期运行一次。有两个作业,它运行 4 次。 DateTrigger 等其他触发器也是如此。

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

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

【问题讨论】:

    标签: python cron apscheduler


    【解决方案1】:

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

    简短答案:app.run(debug=True, use_reloader=False)

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

    【讨论】:

    • Yassine,谢谢,但我认为这不是问题所在。我之前遇到过这个问题并设置了debug=False,use_reloader=False。此外,使用 DateTrigger 时,作业仅按预期运行一次。
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    我遇到了类似的问题,就像我在向调度程序添加新作业时初始化调度程序一样。

    解决方案:

    创建单独的函数或类,它只初始化/调用一次并使用 无论您在哪里使用作业操作,例如:添加、暂停、恢复等

    代码sn-p:

    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 var 将在任何地方使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多