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

时间:2018-04-18 10:06:20

标签: python cron apscheduler

我想使用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次。只需一份工作,就可以运行一次。

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

事实证明,我是一个天才,每次提取工作时都会初始化一个调度程序。 : - ]

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

答案 2 :(得分:0)

我遇到了类似的问题,就我而言,每当我向调度程序添加新作业时,我都会对其进行初始化。

解决方案:

<块引用>

创建单独的函数或类,只初始化/调用一次并使用 无论您在何处使用作业操作,都可以使用调度程序对象,例如:添加、暂停、恢复等

代码片段:

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