Оставьте APScheduler работающим // сохраните объект (Flask) - PullRequest
0 голосов
/ 05 ноября 2018

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