JavaRush /Курсы /Python SELF /Настройка повторяющихся задач (ежедневные и еженедельные ...

Настройка повторяющихся задач (ежедневные и еженедельные напоминания)

Python SELF
40 уровень , 0 лекция
Открыта

1. Настройка простой задачи

Начнем с простейшего примера: как сделать так, чтобы наш код каждый день напоминал нам проверить почту.

Python

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. Напоминания в будние дни

Теперь усложним ситуацию: допустим, вам нужно напоминание только в рабочие дни. Например, каждый будний день мы хотим получать одно и то же напоминание.

Python

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. Настройка еженедельных задач

Что же делать, если вы хотите получать напоминание каждое воскресенье? Скажем, вы хотите проверить запасы кофе перед рабочей неделей. Давайте посмотрим, как это сделать:

Python

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().

Python

job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job)  # Удаление задачи из расписания

Перенос задачи

Для изменения времени выполнения задачи можно использовать повторное назначение расписания. Например, если задача была запланирована на 9:00, но теперь нужно перенести её на 10:00, мы можем перезаписать её расписание.

Python

# Планируем задачу на каждый день в 9:00
job = schedule.every().day.at("09:00").do(my_task)

# Перенос задачи на 10:00
job.clear()  # Очищаем текущее расписание задачи
job.at("10:00")  # Переносим на новое время

Проверка активных задач

Чтобы узнать, есть ли запланированные задачи, можно вывести список всех активных задач с помощью schedule.jobs. Это полезно, когда нужно получить информацию о всех задачах, которые находятся в расписании.

Python

# Добавляем несколько задач
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().

Python

# Планируем несколько задач
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)

# Очистка расписания
schedule.clear()

Выполнение задачи только один раз

Иногда нужно выполнить задачу всего один раз в заданное время. После выполнения такой задачи можно использовать метод schedule.cancel_job(job), чтобы отменить её.

Python

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) в конце вашего цикла, то получите процесс, который будет загружать процессор без остановки, как гиперактивный код. В общем, не забывайте поддерживать скрипт в рабочем состоянии.

Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Long_byte Уровень 55
2 октября 2025

    with open(WEATHER_FILE, "w") as file:
        json.dump(weather_data, file, ensure_ascii=False, indent=4)
    print("Данные о погоде сохранены.")
здесь разве не будет перезаписывать данные ?
Slevin Уровень 11
28 июля 2025
Когда открываешь четвертую задачу: 😳 😧 Когда понимаешь, что она ничем не отличается, как и предыдущие три 😅😂 Кстати, повтор из прошлого уровня. Кроме информации про перенос и отмену, но на них нет задач.