Flask и peewee FlaskDB () "соединение уже открыто" с APScheduler - PullRequest
0 голосов
/ 16 мая 2018

У меня есть приложение фляги с peewee и объединенной базой данных postgresql.

Все работает с настройкой приложения, пока я не добавил задание APScheduler. Я хочу, чтобы работа запускалась при запуске приложения и каждые 8 ​​часов после.

конфигурационные биты для фляги-апшедулера и peewee:

class Config(object):
    JOBS =  [
        {
            'id': 'myjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'interval',
            'hours': 8
        }
        ]
    SCHEDULER_API_ENABLED = True
    DATABASE = 'postgresext+pool://user:password@localhost:5432/dev?max_connections=32&stale_timeout=300'

app.py:

scheduler = APScheduler()
db = FlaskDB()

def create_app(config_object=Config):
    """Application Factory Pattern"""
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    db.init_app(app)
    scheduler.init_app(app)
    scheduler.start()
    # RUN the job on application creation:
    scheduler.run_job('myjob') # <--- exception thrown here
    return app

app = create_app(Config)

строка scheduler.run_job('myjob') приводит к peewee.OperationalError: Connection already opened. сразу после запуска приложения (если я захожу на страницу вскоре после запуска приложения)

Хотя, похоже, что первоначальный запуск задания все еще работает нормально

do_something_job выглядит примерно так:

def do_something_job():
    new = NewModel(seed=new_seed())
    new.save()
    old_list = NewModel.select()
    for old in old_list:
        if old.id != new.id:
            expired = OldModel(seed=old.seed,
                       created_at=old.created_at,
                       expired_at=datetime.datetime.utcnow())
            expired.save()
            old.delete_instance()

Я просто не совсем уверен, чего мне не хватает, я немного новичок, когда дело доходит до пиви / колбы.

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Я подожду некоторое время, прежде чем принять собственный ответ, потому что я уверен, что есть потенциально лучшее / правильное решение.

Но я в основном настроил Flask-APScheduler для запуска начального задания через 30 секунд в будущем и удалил его из моего create_app ().

Я не уверен, что это потому, что база данных еще не инициализирована в тот момент, когда выполняется код, или что именно, и я уверен, что это хакерская ошибка, но она прояснила исключение

В основном добавлено второе задание в конфигурацию (и явный часовой пояс)

class Config(object):
    SCHEDULER_TIMEZONE = 'UTC'
    JOBS =  [
        {
            'id': 'myinitialjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'date',
            'run_date': datetime.datetime.utcnow() + datetime.timedelta(seconds=30)
        },
        {
            'id': 'myjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'interval',
            'hours': 8
        }
        ]
    SCHEDULER_API_ENABLED = True

Удален начальный запуск из функции create_app

def create_app(config_object=Config):
    """Application Factory Pattern"""
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    db.init_app(app)
    scheduler.init_app(app)
    scheduler.start()
    # scheduler.run_job('myjob') # <--- removed this
    return app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...