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 перевіряє, чи є заплановані завдання, кожну секунду за допомогою 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) наприкінці вашого циклу, то отримаєте процес, який буде завантажувати процесор без зупинки, як гіперактивний код. Загалом, не забувайте підтримувати скрипт у робочому стані.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ