Ответ 1
Я сделал это, я добавил в параметр add_interval_job, чтобы начать через определенный промежуток времени
sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
У меня проблема, когда я использую 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
Я сделал это, я добавил в параметр add_interval_job, чтобы начать через определенный промежуток времени
sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
В режиме отладки перезагрузитель Flask дважды загрузит приложение фляги (Как остановить Flask от инициализации дважды в режиме отладки?). Я не уверен, почему это так, но это приводит к тому, что задания apscheduler планируются дважды. Быстрый 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()
Вы можете запустить планировщик в 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()
всегда будет вызываться снова с первым запросом после перезагрузки сервера.
лучшим решением является использование add_cron_job('*')
вместо add_interval_job('*')