Подтвердить что ты не робот

Apscheduler в Flask выполняется дважды

У меня проблема, когда я использую apscheduler в моем приложении с флягой.

В моем файле view.py я пишу это как

import time
from apscheduler.scheduler import Scheduler

def test_scheduler():
     print "TEST"
     print time.time()


sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()

И затем этот метод test_scheduler() выполняется дважды каждые пять секунд

TEST +1360844314,01 КОНТРОЛЬНАЯ РАБОТА +1360844314,2

4b9b3361

Ответ 1

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

sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')

Ответ 2

В режиме отладки перезагрузитель Flask дважды загрузит приложение фляги (Как остановить Flask от инициализации дважды в режиме отладки?). Я не уверен, почему это так, но это приводит к тому, что задания apscheduler планируются дважды. Быстрый print "loaded scheduler" перед sched.start() подтверждает это.

Существует несколько способов обойти это, как указано в связанном ответе. Тот, который я нашел лучше всего, - это просто отключить перезагрузку:

app.run(use_reloader=False)

Это означает, что я должен перезагружать свое приложение вручную, когда я его разрабатываю, но это небольшая цена, чтобы заплатить за работу apscheduler.

Ответ 3

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

if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
  sched = Scheduler()
  sched.add_interval_job(test_scheduler, seconds=5)
  sched.start()

Ответ 4

Вы можете запустить планировщик в Flask before_first_request() decorator, который "регистрирует функцию, которая должна быть запущена до первого запроса к этому экземпляру приложение".

import time
import atexit

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger

@app.before_first_request
def initialize():
    scheduler = BackgroundScheduler()
    scheduler.start()
    scheduler.add_job(
        func=print_date_time,
        trigger=IntervalTrigger(seconds=5),
        id='printing_job',
        name='Print date and time every five seconds',
        replace_existing=True)
    # Shut down the scheduler when exiting the app
    atexit.register(lambda: scheduler.shutdown())

def print_date_time():
    print time.strftime("%A, %d. %B %Y %I:%M:%S %p")

Обратите внимание, что before_first_request() всегда будет вызываться снова с первым запросом после перезагрузки сервера.

Ответ 5

лучшим решением является использование add_cron_job('*') вместо add_interval_job('*')