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

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

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

  • Как запустить повторяющуюся задачу в фреймворке Python?
  • 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 TEST 1360844314.2

  • Как можно сохранить уникальное соединение Rserve за сеанс?
  • можете ли вы добавить функциональность HTTPS на веб-сервер флипсы python?
  • Требуются ли uWSGI и Nginx для работы с флеш-приложением?
  • Как выполнять периодическую задачу с Flask в Python
  • Ссылка на статические файлы Flask с url_for
  • Возвращать код состояния HTTP 201 в колбе
  • 5 Solutions collect form web for “apscheduler в Flask выполняется дважды”

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

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

     app.run(use_reloader=False) 

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

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

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

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

     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() всегда будет вызываться снова с первым запросом после перезагрузки сервера.

    Я сделал это, я добавил в параметр add_interval_job, чтобы начать после определенного момента времени

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

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

    Python - лучший язык программирования в мире.