APScheduler на Flask, чтобы взять данные и сохранить, где они остановились - PullRequest
1 голос
/ 11 апреля 2020

Используя Flask, SQLAlchemy, я делаю сайт и имею функцию, которая агрегирует цены на акции. Я хотел бы сохранить данные в Postgres, используя APScheduler. Но я также хочу, чтобы он определил, где он остановился.

Поскольку сервер находится только на локальной машине, он не всегда работает. Если я выключу его в середине недели и снова включу в понедельник, я бы хотел, чтобы он получал и сохранял данные из wed ~ now.

Из APScheduler do c, я понял Пока сервер всегда работает, эта функция должна работать.

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()   

def save_stock_price():
    """save stock prices to psql db"""
    tickers = all_tickers()
    stock_prices = fetch_all(tickers)
    data = StockPrice(data=stock_prices)
    try:
        data.save() # runs db.session.add(self), db.session.commit()
    except (KeyError, RuntimeError):
        pass

def schedule_stock_price(scheduler):
    """1600, weekdays"""
    scheduler.add_job(id='Scheduled task3',
                  func=save_stock_price,
                  trigger='cron',
                  day_of_week='mon-fri',
                  hour='16',
                  minute=1,
                  timezone='EST'
                  )
    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass


schedule_stock_price(scheduler)

Но она настроена на работу в 16:01 один раз в день в будние дни.

Как включить его забрать с того места, где он остановился и заполнить пробел?

1 Ответ

1 голос
/ 11 апреля 2020

С точки зрения шаблона проектирования, вы можете подходить к этому с неправильной точки зрения. Запланированное задание не имеет состояния в том смысле, что оно «должно выполняться прямо сейчас» или не должно. Чтобы «заполнить пробелы», вам нужно будет ввести другой процесс. Как насчет второй запланированной задачи, основной задачей которой является определение, если в какие-то дни отсутствуют данные, и go и, если да, выборка? Упрощенный процесс может выглядеть примерно так:

  • Ежедневный процесс (назовите этот Процесс A) настроен на запуск каждый день в указанное время. Когда он выполняется, он записывает в базу данных строку, содержащую цену (и) акций.
  • Процесс разрыва (назовите этот Процесс B) установлен на запуск каждый день после того, как Процесс A будет запущен , так что если процесс A выполняется в понедельник, то процесс B увидит, что в понедельник есть данные.
  • Задача процесса B -
    1. Получить последнюю, самую последнюю строку базы данных и проверить отметку даты
    2. Если отметка даты совпадает с текущей датой, ничего не делать и выходить.
    3. Если даты разные, определите все даты между последней строкой и текущей датой
    4. Для каждой из этих пропущенных дат go и извлечение данных
    5. Запишите эти данные в базу данных

В зависимости от того, сколько времени займет процесс A, вы определенно хотели бы, чтобы процесс B запускался после того, как процесс A когда-либо запускал в последний раз, чтобы избежать случая, когда они перекрываются, что может вызвать некоторые условия гонки, если ваша логика c не реализована с нимательно.

...