在uwsgi app中启动APScheduler最终会为每个工作者安排一个调度程序吗?

时间:2014-06-22 15:18:13

标签: python flask uwsgi worker apscheduler

我有一个烧瓶应用程序,我需要APScheduler的调度功能。问题是:

我从哪里开始调度程序实例?

我使用uwsgi + nginx为多个工作人员提供这个应用程序服务,我最终会得到多个Scheduler实例,这些实例会彼此无视?如果这是正确的,那么单个作业将被多次触发,不是吗?

在这种情况下,最好的策略是什么,所以我最终只得到一个Scheduler实例,并且仍然能够从预定的工作中访问应用程序的上下文?

This question虽然有枪炮而不是uwsgi也有同样的问题,但答案可能类似。

以下是定义" app"作为uwsgi可调用的应用程序对象。 包含此代码的文件称为wsgi.py(不重要)。

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()

2 个答案:

答案 0 :(得分:3)

uWSGI有一个名为mules的功能(参见:http://uwsgi-docs.readthedocs.org/en/latest/Mules.html),您可以使用它们在主服务器下启动脚本,该脚本无法通过套接字访问。它旨在使用调度程序从主应用程序卸载工作并进行信号处理,因此它似乎非常适合在uwsgi堆栈中部署调度程序。

答案 1 :(得分:0)

UWSGI有一个函数uwsgi.worker_id()。如果在特定工作程序中有条件地启动调度程序,则最终不会有多个调度程序实例。