我有一个使用 Flask 框架开发的应用程序,其中需要使用 APScheduler 的调度功能。问题是:
我该在哪里启动调度器实例?
我使用 uwsgi+nginx 来提供此应用程序,并使用多个 worker,这样是否会导致多个调度器实例相互独立?如果是这样,单个作业是否会被触发多次?
在这种情况下,最佳策略是什么,以便只得到一个调度器实例并仍能够从计划的作业内访问应用程序上下文?
这个问题 与使用 gunicorn 而不是 uwsgi 时存在相同的问题,但答案可能类似。
以下是将 "app" 定义为 uwsgi 可调用应用程序对象的代码。
app = create_app(config=ProductionConfig())
def job_listener(event):
get_ = "msg from job '%s'" % (event.job)
logging.info(get_)
# This code below never gets invoked when I check with worker_id() == 1
# The only time it is run is with worker_id() value of 0
app.sched = Scheduler()
app.sched.add_jobstore(ShelveJobStore('/tmp/apsched_%d' % uwsgi.worker_id()), 'file')
app.sched.add_listener(job_listener,
events.EVENT_JOB_EXECUTED |
events.EVENT_JOB_MISSED |
events.EVENT_JOB_ERROR)
app.sched.start()