2016-01-20 8 views
3

Я бег планировщика, используя питонapscheduler внутри web.py рамочных. Функция runningerver должна работать каждый день при 9 мА, но она несовместима. Он работает в большинстве дней, но через некоторое время пропускает один день.питон apscheduler не соответствует

Код:

import web 
from apscheduler.schedulers.blocking import BlockingScheduler #Blocking Scheduler 

#URLs 
urls = (
    '/startscheduler/','index', 
    ) 

Nightlysched = BlockingScheduler() 

@Nightlysched.scheduled_job('cron', hour=9) 
def runserver(): 
    print 2+2 #doing some calculations here 

#Main function to run the cron JOB 
if __name__ == "__main__": 
    Nightlysched.start() #stating the job 
    app = web.application(urls, globals()) 
    app.run() 

Что такое правильный способ настроить планировщик для запуска каждый день в 9.a.m?

+1

Я не могу понять, как этот код работает вообще. Nightlysched.start() блокирует и не позволяет вашему веб-приложению запускаться. Тем не менее, конфигурация верна. Включите ведение журнала отладки (установите loglevel «apscheduler» в DEBUG), чтобы выяснить, что происходит. –

+0

После запуска планировщика (Nightlysched.start()) он запускает веб-приложение, как ожидалось. Не могли бы вы рассказать мне, как установить loglevel apstcheduler? Я пробовал несколько вещей, но это не сработало. Спасибо – ashishashen

ответ

4

APScheduler имеет льготный период, во время которого рабочие места разрешены для запуска. Если по какой-либо причине планировщик занят и/или загрузка хоста слишком высока, APScheduler может не запустить задание вовремя.

В этом случае задание будет отброшено, если оно не может быть запущено в течение льготного времени (пояснительное сообщение будет зарегистрировано, если вы инициализировали ведение журнала Python).

В зависимости от фактической первопричины:

  • Если планировщик не удался запланировать работу во время, вы можете использовать misfire_grace_time=None сказать APScheduler планировать работу, как только он может вместо того, чтобы отказаться его.
  • По умолчанию разрешается запускать только один экземпляр каждого задания одновременно. Убедитесь, что предыдущий запуск завершен. Можно установить максимальное количество экземпляров для определенного задания, которое планировщик будет запускать одновременно, используя аргумент ключевого слова max_instances при добавлении задания. В этом случае вам также может понадобиться использовать coalesce=False. Делайте это только в том случае, если задание занимает больше 24 часов (в вашем случае), и вы соглашаетесь, что два экземпляра вашей работы могут выполняться одновременно.
  • Если было слишком много заданий, но загрузка машины была не слишком высокой, это означает, что у вас есть больше заданий, чем то, что вы можете запускать одновременно. Вы можете попытаться увеличить размер пула потоков, который выполняет APScheduler , исполнитель используется для запуска заданий (это зависит от вашей настройки, проверьте: http://apscheduler.readthedocs.org/en/latest/userguide.html).

В заключение, я бы сначала попробовать с misfire_grace_period:

@Nightlysched.scheduled_job('cron', hour=9, misfire_grace_time=None) 

Как примечание, хотя, как @Alex упоминал, что я не понять, почему ваш код работает, потому что вызов должен Nightlysched.start() блокировать и препятствовать запуску вашего веб-приложения. Я предполагаю, что это вставленный код и на самом деле не представляет то, что вы используете. Для меня похоже, что вместо этого вы должны использовать неблокирующий планировщик, например BackgroundScheduler.

+1

Спасибо за подробное объяснение jjmontes. Я попробую это. Также я также думал, что фоновый планировщик является лучшим вариантом, но не смог запланировать работу с планировщиком фона каждый день на 9.Все примеры, которые я мог найти, были настроены на интервал, что-то вроде scheduler.add_job (runfunction, 'interval', minutes = 15). Можете ли вы рассказать мне, как преобразовать интервал в ежедневный часовой cron? – ashishashen

+0

Попробуйте 'scheduler.add_job (your_function, trigger = 'cron', hour = 9, misfire_grace_time = None)'. Триггерным аргументом может быть «дата», «интервал» или «cron», или вы даже можете реализовать свой собственный триггер-класс (мне никогда не нужно было это делать;)). – jjmontes

+0

Также ознакомьтесь с [исходным кодом и документом 'add_job'] (https://bitbucket.org/agronholm/apscheduler/src/a6545cf29831bb6d8f055aeb2fa9d5204e9bd192/apscheduler/schedulers/base.py?at=master&fileviewer=file-view -default # base.py-315), я нашел его довольно информативным! – jjmontes