У меня есть приложение 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