1. Настройка простой задачи
Начнем с простейшего примера: как сделать так, чтобы наш код каждый день напоминал нам проверить почту.
import schedule
import time
def job():
print("Напоминание: проверьте свою почту!")
# Установка задачи на ежедневный запуск
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
В этом примере функция job будет вызываться каждый день в 9 утра. Библиотека schedule проверяет, есть ли запланированные задания, каждые 1 секунду с помощью run_pending(). Не забывайте, что ваш код должен работать постоянно, чтобы задача исполнялась.
Заметки для крутых хакеров
Обратите внимание, что вы можете использовать every().hour, чтобы запускать задачу каждый час, или every(2).hours, чтобы запускать её каждые два часа. Возможности почти безграничны.
2. Напоминания в будние дни
Теперь усложним ситуацию: допустим, вам нужно напоминание только в рабочие дни. Например, каждый будний день мы хотим получать одно и то же напоминание.
import schedule
import time
def weekday_job():
print("Рабочее напоминание: не забудьте подготовить отчет!")
schedule.every().monday.at("08:00").do(weekday_job)
schedule.every().tuesday.at("08:00").do(weekday_job)
schedule.every().wednesday.at("08:00").do(weekday_job)
schedule.every().thursday.at("08:00").do(weekday_job)
schedule.every().friday.at("08:00").do(weekday_job)
while True:
schedule.run_pending()
time.sleep(1)
В этом случае в 8 утра каждое буднее утро вам будет выдаваться напоминание о подготовке отчета. Таким образом ваш скрипт всегда будет следить за графиком, даже когда вы забудете об этом.
3. Настройка еженедельных задач
Что же делать, если вы хотите получать напоминание каждое воскресенье? Скажем, вы хотите проверить запасы кофе перед рабочей неделей. Давайте посмотрим, как это сделать:
import schedule
import time
def sunday_job():
print("Напоминание: проверьте запасы кофе для следующей недели!")
schedule.every().sunday.at("18:00").do(sunday_job)
while True:
schedule.run_pending()
time.sleep(1)
Этот небольшой фрагмент кода добавит немного порядка в ваше воскресенье, напоминая, что нужно подготовиться к следующей неделе. Теперь ваш кофе никогда не закончится в самый неожиданный момент. Да, я знаю, что это может быть трагедией для многих.
4. Изменение задач
Удаление задач из расписания
Если нужно отменить выполнение задачи, можно воспользоваться методом cancel_job(). Например, чтобы удалить задачу из расписания, можно получить объект задачи и вызвать для него cancel_job().
job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job) # Удаление задачи из расписания
Перенос задачи
Для изменения времени выполнения задачи можно использовать повторное назначение расписания. Например, если задача была запланирована на 9:00, но теперь нужно перенести её на 10:00, мы можем перезаписать её расписание.
# Планируем задачу на каждый день в 9:00
job = schedule.every().day.at("09:00").do(my_task)
# Перенос задачи на 10:00
job.clear() # Очищаем текущее расписание задачи
job.at("10:00") # Переносим на новое время
Проверка активных задач
Чтобы узнать, есть ли запланированные задачи, можно вывести список всех активных задач с помощью schedule.jobs. Это полезно, когда нужно получить информацию о всех задачах, которые находятся в расписании.
# Добавляем несколько задач
schedule.every().day.at("09:00").do(my_task)
schedule.every().monday.at("10:00").do(my_task)
# Просмотр всех активных задач
for job in schedule.jobs:
print("Задача:", job)
Удаление всех задач из расписания
Если нужно очистить расписание и удалить все запланированные задачи, можно использовать метод clear().
# Планируем несколько задач
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)
# Очистка расписания
schedule.clear()
Выполнение задачи только один раз
Иногда нужно выполнить задачу всего один раз в заданное время. После выполнения такой задачи можно использовать метод schedule.cancel_job(job), чтобы отменить её.
def one_time_task():
print("Задача выполнена один раз")
return schedule.CancelJob # Отмена задачи после выполнения
# Запланируем выполнение задачи один раз
schedule.every().day.at("09:00").do(one_time_task)
while True:
schedule.run_pending()
time.sleep(1)
5. Реальные сценарии использования
А теперь давайте более серьезно: как подобные автоматизации внедряются в профессиональной среде? В реальной жизни вы можете использовать планирование задач для:
- Автоматического сбора данных каждый день или каждую неделю.
- Создания и отправки отчетов в определенный день и время.
- Мониторинга состояния вашего сервера или веб-интерфейса с уведомлениями об ошибках.
- Запуска регулярных бэкапов базы данных.
Типичные ошибки
Пока вы занимаетесь планированием задач, будьте осторожны с рассинхронизацией времени, например, если ваш сервер и ваш локальный компьютер находятся в разных временных зонах. Также, если ваш скрипт случайно завершился, запланированная задача не будет выполнена. Используйте инструменты мониторинга, такие как cron (для Unix-подобных систем) или Windows Task Scheduler.
Если вы случайно забудете поставить time.sleep(1) в конце вашего цикла, то получите процесс, который будет загружать процессор без остановки, как гиперактивный код. В общем, не забывайте поддерживать скрипт в рабочем состоянии.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ