2015-03-24 2 views
2

Я пытаюсь запланировать интервальное задание с помощью APScheduler (v3.0.0).Как планировать интервальное задание с помощью APScheduler?

Я пробовал:

from apscheduler.schedulers.blocking import BlockingScheduler 
sched = BlockingScheduler() 

def my_interval_job(): 
    print 'Hello World!' 
sched.add_job(my_interval_job, 'interval', seconds=5) 
sched.start() 

и

from apscheduler.schedulers.blocking import BlockingScheduler 
sched = BlockingScheduler() 

@sched.scheduled_job('interval', id='my_job_id', seconds=5) 
def my_interval_job(): 
    print 'Hello World!' 
sched.start() 

Либо должны работать в соответствии с the docs, но работа никогда не стреляет ...


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


UPDATE 2:
После дальнейшего тестирования я обнаружил, что «интервал» рабочие места, как представляется, как правило, слоеное ... Вышеприведенный код работает в моем Dev среде, но не тогда, когда я развернитесь в промежуточную среду (я использую приложение heroku для постановки). У меня есть другие задания apccheduler cron, которые отлично работают в стадии постановки/производства.

При включении протоколирования DEBUG для «apscheduler.schedulers» регистратор, журнал указывает на то, что интервал задания добавляются:

Добавлена ​​работа «my_cron_job1» для работы магазина «по умолчанию»
Добавлено работы «my_cron_job2» для работы магазина «по умолчанию»
Добавлена ​​работа «my_interval_job» на работу магазина «по умолчанию»
планировщик начал
Добавление задания ориентировочно - это будет правильно по расписанию, когда планировщик начинает
Добавление задания ориентировочно - это будет правильно по расписанию, когда планировщик начинает
Ищет работу для запуска
Следующего пробуждения связанно в 2015-03-24 15: 05: 00-07: 00 (в 254.210542 секундах)

Каким образом следующее пробуждение должно быть выполнено через 254 секунды, когда задание интервалов установлено на 5 секунд?

ответ

0

У документации возникли ошибки. Я исправил это сейчас. Это первая линия должна быть:

from apscheduler.schedulers.blocking import BlockingScheduler 

Было бы поднял ImportError, хотя, но не упомянул ни. Вы попробовали любой из предоставленных examples?

+0

У меня действительно был 'от apscheduler.schedulers.blocking import BlockingScheduler' в моем коде. Я просто неправильно скопировал строку в вопрос stackoverflow. Я исправил свой оригинальный вопрос и добавил некоторые другие обновления. – Troy

2

Я не понял, что вызвало исходную проблему, но я обошел ее, заменив порядок, в котором запланированы задания, так что задание «интервал» запланировано ПЕРЕД заданиями «cron».

i.e.Я переключился с этим:

def my_cron_job1(): 
    print "cron job 1" 

def my_cron_job2(): 
    print "cron job 2" 

def my_interval_job(): 
    print "interval job" 

if __name__ == '__main__': 
    from apscheduler.schedulers.blocking import BlockingScheduler 
    sched = BlockingScheduler(timezone='MST') 

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10) 
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20) 

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5) 

к этому:

def my_cron_job1(): 
    print "cron job 1" 

def my_cron_job2(): 
    print "cron job 2" 

def my_interval_job(): 
    print "interval job" 

if __name__ == '__main__': 
    from apscheduler.schedulers.blocking import BlockingScheduler 
    sched = BlockingScheduler(timezone='MST') 

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5) 

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10) 
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20) 

и теперь оба хрон рабочих мест и рабочих мест интервал запуска без проблем в обеих средах.

+2

Я бы рекомендовал не указывать часовой пояс. Я просто помог решить проблему летнего времени, когда разработчик указал часовой пояс EST. Вместо этого проблема переключилась на «Америка/Нью-Йорк». Всегда предпочитайте локальные названия часовых поясов, потому что они никогда не являются двусмысленными. –

0

Хорошо, я просмотрел обновленный вопрос.

Причина, по которой у вас возникают проблемы, может заключаться в том, что вы можете использовать неправильный часовой пояс. В настоящее время ваша страна использует летнее время в большинстве мест, поэтому правильный часовой пояс, вероятно, будет MDT (Mountain Daylight Time). Но это снова сломается, когда вы вернетесь к стандартному времени. Поэтому я советую вам использовать часовой пояс, например «Америка/Денвер». Это позаботится о переключателях DST.

Вопрос: Вы используете CentOS? Пока это единственная известная операционная система, где автоматическое обнаружение локального часового пояса невозможно.

1

Вам нужно сохранить поток в живом состоянии. Вот пример того, как я его использовал.

from subprocess import call 

import time 
import os 

from apscheduler.schedulers.background import BackgroundScheduler 


def job(): 
    print("In job") 
    call(['python', 'scheduler/main.py']) 


if __name__ == '__main__': 
    scheduler = BackgroundScheduler() 
    scheduler.configure(timezone=utc) 
    scheduler.add_job(job, 'interval', seconds=10) 
    scheduler.add 
    scheduler.start() 
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C')) 

    try: 
     # This is here to simulate application activity (which keeps the main thread alive). 
     while True: 
      time.sleep(5) 
    except (KeyboardInterrupt, SystemExit): 
     # Not strictly necessary if daemonic mode is enabled but should be done if possible 
     scheduler.shutdown() 

 Смежные вопросы

  • Нет связанных вопросов^_^