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

Python 当作业设置为同时运行时,APScheduler作业会运行多次,python,cron,apscheduler,Python,Cron,Apscheduler,我想使用APScheduler和调度程序调度和运行作业 假设我用两个不同的工作ID做了两次。有两个作业,设置为同时运行。对于一个作业,它会按预期运行一次。对于两个作业,它运行4次。其他触发器(如DateTrigger)也会发生同样的情况 注意,这是在烧瓶应用程序中设置的。通常,应用程序会调用另一个API来获取作业,然后逐个安排作业 编辑:我的实际应用程序会同时获取3个作业并安排它们。当我获取1个作业而不是3个作业时,错误不会发生。当我有3个作业时,函数运行9次。对于1个作业,它只运行一次。这是因

我想使用APScheduler和调度程序调度和运行作业

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

注意,这是在烧瓶应用程序中设置的。通常,应用程序会调用另一个API来获取作业,然后逐个安排作业


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

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

简短回答:app.rundebug=True,use_reloader=False


完整答案如下:

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


因此,现在,我将管理调度的类更改为singleton,并将调度程序初始化为singleton,它按预期工作。

我遇到了类似的问题,因为在我的案例中,每当我向调度程序添加新作业时,我都会初始化调度程序

解决方案:

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

代码段:

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

Yassine,谢谢,但我认为这不是问题所在。我以前遇到过这个问题,并将debug=False,use\u reloader=False设置为False。此外,使用DateTrigger时,作业仅按预期运行一次。您是如何将计划程序初始化为单例的?这种类型的模式/实现:
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