JavaRush /Курсы /Python SELF /Использование библиотеки schedule для запуска задач по ра...

Использование библиотеки schedule для запуска задач по расписанию

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

1. Введение в библиотеку schedule

В этой лекции мы, как настоящие часовые механизмы, научимся запускать задачи по расписанию, чтобы наш код работал тогда, когда мы этого захотим. Приготовьтесь, сегодня мы будем приручать время!

Библиотека schedule — это легковесный модуль для запуска функций по заданному расписанию. Если ваш код должен исполняться по определенному расписанию, например, собирать данные каждый день в 6 утра или отправлять ежедневные напоминания, то schedule — это то, что вам нужно.

Вот основные преимущества schedule:

  • Простота: интуитивно понятный интерфейс, который гораздо проще использовать, чем стандартное решение через cron или threading.
  • Минимализм: нет лишних функций — только те, которые нужны.
  • Понятность: использование почти естественного языка для задания расписания.

Установка библиотеки

Для начала работы необходимо установить библиотеку schedule. Как и для большинства Python-библиотек, используем pip:

Bash
pip install schedule

Теперь, когда все готово, давайте погрузимся в мир автоматизации и увидим, как schedule может изменить вашу повседневную работу.

Основные методы библиотеки schedule

Библиотека schedule предоставляет методы для настройки задач на разное время и с разной частотой выполнения:

  • every().day.at("HH:MM") — выполнение задачи каждый день в определенное время.
  • every().hour — выполнение задачи каждый час.
  • every().minute — выполнение задачи каждую минуту.
  • every().week.at("HH:MM") — выполнение задачи каждую неделю в определенное время.
  • every().monday.at("HH:MM") — выполнение задачи по понедельникам в определенное время.
  • every(10).seconds — выполнение задачи каждые 10 секунд (или любое другое количество времени).

2. Настройка повторяющихся задач

Давайте начнем с чего-то простого — запланируем функцию, которая будет выполняться каждый час. Мы создадим простую функцию, которая выводит приветственное сообщение, и запустим её по расписанию.

Пример: каждочасовое приветствие

Python

import schedule
import time

def say_hello():
    print("Привет! Мы работаем в часовой автоматизации.")

# Запускаем функцию say_hello каждый час
schedule.every().hour.do(say_hello)

while True:
    # Выполняет все задачи, время которых подошло
    schedule.run_pending()
    time.sleep(1)

Вот и всё — ваш первый скрипт с schedule! В этом примере мы используем метод every().hour.do(say_hello), чтобы говорить "Привет!" каждый час. Интересно, не правда ли?

Команда schedule.every().hour.do(say_hello) не выполняет функцию say_hello, а добавляет ее вызов в расписание. Реальный же вызов функции произойдет когда подойдет ее время - она будет вызвана с помощью кода schedule.run_pending().

3. Настройка более сложных интервалов

Что, если мы хотим запускать задачи не только каждый час, но и, скажем, каждые 10 минут или в определенные дни недели? schedule поддерживает большинство распространенных временных выражений, и вы можете использовать их с не меньшей легкостью.

Пример: запуск задачи каждые 10 минут

Python

import schedule
import time

def task():
    print("Эта задача выполняется каждые 10 минут.")

# Запланируем запуск задачи каждые 10 минут
schedule.every(10).minutes.do(task)

while True:
    schedule.run_pending() # Вызываем все задачи, время которых подошло
    time.sleep(1)

Пример: запуск задачи по определенным дням

А теперь попробуем запланировать задачу, которая будет выполняться в определенные дни недели, например, по понедельникам и средам, но только в 9 утра.

Python

import schedule
import time

def monday_wednesday_task():
    print("Эта задача выполняется по понедельникам и средам в 9 утра.")

# Запуск задачи по понедельникам и средам в 9 утра
schedule.every().monday.at("09:00").do(monday_wednesday_task)
schedule.every().wednesday.at("09:00").do(monday_wednesday_task)

while True:
    schedule.run_pending()
    time.sleep(1)

Как видите, schedule обрабатывает различные временные выражения, включая дни недели и точное время запуска. Это невероятно удобно для планирования задач, синхронизированных с вашей работой или запланированными событиями.

4. Обработка задач с разными временными условиями

Если ваш скрипт выполняет несколько задач, и каждая из них имеет свое расписание, schedule легко справится и с этим. Например, одна задача может запускаться каждое утро, другая — по пятницам.

Пример: объединение разных задач в одном скрипте

Python

import schedule
import time

def morning_task():
    print("Доброе утро! Время для утренней задачи.")

def friday_task():
    print("Ура, пятница! Время для пятничной задачи.")

# Утренние задачи каждое утро в 7:30
schedule.every().day.at("07:30").do(morning_task)

# Пятничные задачи каждую пятницу в 16:00
schedule.every().friday.at("16:00").do(friday_task)

while True:
    schedule.run_pending()
    time.sleep(1)

Практические советы и типичные ошибки

Когда дело доходит до автоматизации задач с помощью schedule, есть несколько аспектов, на которые стоит обратить внимание.

Во-первых, помните, что schedule запускает задачи в основном потоке. Это значит, что если ваша задача длительная или может заблокировать выполнение других задач, стоит задуматься об использовании многопоточности или асинхронных вызовов для задач.

Во-вторых, если ваша задача должна выполняться в строго определенное время и это критично, убедитесь, что ваше устройство включено и скрипт работает. schedule не будет работать, если скрипт остановлен или устройство выключено.

И, наконец, самое распространенное заблуждение — ожидание того, что schedule сможет компенсировать пропущенные задачи. К сожалению, если ваш скрипт не работал, когда задача должна была быть выполнена, schedule не выполнит её задним числом.

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 64
27 июля 2025
Какой метод библиотеки schedule позволяет запланировать задачу на выполнение каждый час? Ошибка в написании правильного ответа: - every().hours.do() # а не: - every().hours().do() При этом этот ответ принимается