【问题标题】:Error Running Multiple Jobs In APScheduler "apscheduler.schedulers.SchedulerAlreadyRunningError: Scheduler is already running"在 APScheduler 中运行多个作业时出错“apscheduler.scheduler.SchedulerAlreadyRunningError:调度程序已在运行”
【发布时间】:2020-04-20 19:45:15
【问题描述】:

我正在尝试在 APScheduler 中运行多个作业,然后稍后将其删除。但是,运行下面的代码会给我这个错误,“apscheduler.scheduler.SchedulerAlreadyRunningError:调度程序已经在运行。”

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
import time


sched = BackgroundScheduler(daemon=True)
def settingJobs(number):
    global sched
    theId = "id"+number
    print("hello?")
    sched.add_job(deletingJobs, 'interval', args=[theId], seconds=5, id=theId)
    sched.start()

def deletingJobs(theId):
    print("Testing")
    sched.remove_job(theId)


app = Flask(__name__)
@app.route('/')
def index():
    for x in range(0,5):
        settingJobs(str(x))
        time.sleep(2)

    return "hello"

if __name__ == "__main__":
    app.run(debug=False, use_reloader=False)

我得到的输出如下所示

hello?
hello?
…
…
…
apscheduler.schedulers.SchedulerAlreadyRunningError: Scheduler is already running

如果有人可以指导我如何解决此问题或如何运行多个作业并删除 他们以后,那就太好了。

谢谢。

【问题讨论】:

  • 为什么这么沉默!同样的问题。

标签: python-3.x apscheduler


【解决方案1】:

我也一直在努力解决这个问题,但事实证明它确实非常简单。

使用 APScheduler 时,您必须像之前那样定义一个调度器对象:

sched = BackgroundScheduler(daemon=True)

并启动它以开始验证您的内部工作列表。所以如果一个工作被添加到这个工作列表中,这个工作将被安排,如果这个工作被删除,它将不再被安排。 所以这是用这个想法重构的代码:

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
import time


sched = BackgroundScheduler(daemon=True)
sched.start() # notice that the "start to watch" process happen here

def settingJobs(number):
    global sched
    theId = "id"+number
    print("hello?")
    sched.add_job(deletingJobs, 'interval', args=[theId], seconds=5, id=theId)

def deletingJobs(theId):
    print("Testing")
    sched.remove_job(theId)


app = Flask(__name__)
@app.route('/')
def index():
    for x in range(0,5):
        settingJobs(str(x))
        time.sleep(2)

    return "hello"

if __name__ == "__main__":
    app.run(debug=False, use_reloader=False)

Obs.: 引发错误的原因是,您已经在第一次循环迭代中启动了该调度程序对象,因此在第二次迭代中,Python 尝试重新启动“未停止”调度程序。

【讨论】:

    【解决方案2】:

    Lukasavicus 是对的,简而言之,这行就是问题所在:

    sched.start()
    

    当您添加或删除作业时,您并没有停止调度程序,并且当您再次调用此方法时调度程序仍在运行。你应该把它移到别处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2013-03-11
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多