Как определить временные границы работы интервального планировщика Python?
С помощью библиотеки APScheduler использую фоновые задачи BackgroundScheduler. У него есть метод add_job(), при помощи которого указываю интервал в виде add_job(..., 'interval', hours=1). Задача, переданная в add_job() будет вызываться каждый час, однако как реализовать систему, при которой задача будет вызываться каждый час с условных 10 часов утра до 21 часов вечера? Т.е., каким образом задать границы работы интервального планировщика?
Ответы (1 шт):
Для такой задачи нужно использовать крон, а не интервал. Но, тем не менее - неточное значение минут/секунд вы указать не сможете.
sched.add_job(job, 'cron', hour='10-21', minute='*/7', second='30')
UPD. Обновлено по просьбе автора.
hour='10-21' - Запускать каждый час с 10 до 21
minute='*/7' - Запускать каждые 7 минут.
second='30' - Запускать по достижению 30 секунд.
Пример с BlockingScheduler:
from apscheduler.schedulers.background import BlockingScheduler
from datetime import datetime
sched = BlockingScheduler(timezone='Europe/Moscow')
def job():
print(datetime.now().time())
sched.add_job(job, 'cron', hour='9-10', minute='*/1', second='5')
sched.start()
Запускает задачу каждую минуту и в 5 секунд.
Из этого следует что отталкиваясь от шедулера вы можете запускать задачу в фиксированное время в интервале. С возможностью запускать внутренний интервал повторений. Но отсутствует возможность - содавать сдвиги через неточные значения. И с какой то стороны это логично, если подумать.
Вывод, используйте используйте точные значения в интервале минут/часов/секунд. Каждые 450 секунд сделать не получится. Зато получится 420 и 480.
Тем не менее, никто не мешает вам сделать так)
from apscheduler.schedulers.background import BlockingScheduler
from datetime import datetime
from time import sleep
sched = BlockingScheduler(timezone='Europe/Moscow')
def job():
sleep(449)
print(datetime.now().time())
sched.add_job(job, 'cron', hour='10-21', second='*/1')
sched.start()