我有一个Flask应用程序,它使用APScheduler程序包作为调度程序。
我希望将APScheduler实例保留在我的Flask应用程序中,以使其永远不会关闭并且可以处理计划的作业。
这就是我所拥有的,但是该对象似乎并没有持久化。预定的呼叫不会发生。在日志中,我确实看到了“下次在XXX唤醒”,因此我假设调度程序最终被关闭了。
from flask import Flask
from scheduler import Scheduler
application = Flask(__name__)
scheduler = Scheduler()
if __name__ == "__main__":
application.run(debug=False, port=5002, use_reloader=False)
在调度程序文件中,我将其设计为单例。
class Scheduler(object):
instance = None
def __init__(self):
if not Scheduler.instance:
Scheduler.instance = Scheduler.__Scheduler()
def __getattr__(self, name):
return getattr(self.instance, name)
@staticmethod
def run_job(job_data):
## Trigger function for running a job
pass
class __Scheduler:
def __init__(self):
"""Scheduler uses APScheduler to schedule jobs that will be sent to workers"""
self.scheduler = None
self.job_store = None
self.initialize_scheduler()
def initialize_scheduler(self):
POSTGRES_USER = os.environ["RDS_USERNAME"]
POSTGRES_PW = os.environ["RDS_PASSWORD"]
POSTGRES_URL = os.environ["RDS_HOSTNAME"]
POSTGRES_DB = os.environ["RDS_DB_NAME"]
self.SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://{user}:{pw}@{url}/{db}'.format(user=POSTGRES_USER,
pw=POSTGRES_PW,
url=POSTGRES_URL,
db=POSTGRES_DB)
self.job_store = SQLAlchemyJobStore(url=self.SQLALCHEMY_DATABASE_URI)
self.scheduler = BackgroundScheduler(jobstores={
"default" : self.job_store
})
self.scheduler.start()
print("Scheduler initialized")
def schedule_job(self, job_data):
print("Scheduling job", job_data["id"])
scheduler = self.scheduler
## Scheduling tasks here using IntervalTrigger