1. Konfigurowanie prostego zadania
Zaczniemy od prostego przykładu: jak sprawić, by nasz kod codziennie przypominał nam o sprawdzeniu poczty.
import schedule
import time
def job():
print("Przypomnienie: sprawdź swoją pocztę!")
# Ustawianie zadania na codzienne uruchamianie
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
W tym przykładzie funkcja job będzie uruchamiana codziennie o 9 rano. Biblioteka schedule sprawdza planowane zadania co 1 sekundę za pomocą run_pending(). Pamiętaj, że twój kod musi być stale uruchomiony, aby zadanie się wykonywało.
Porady dla sprytnych
Zwróć uwagę, że możesz używać every().hour, aby uruchamiać zadanie co godzinę, lub every(2).hours, aby uruchamiać je co dwie godziny. Opcje są niemal nieograniczone.
2. Przypomnienia w dni robocze
Teraz trochę pokomplikujmy: załóżmy, że potrzebujesz przypomnienia tylko w dni robocze. Na przykład, każdego dnia roboczego chcemy otrzymywać to samo przypomnienie.
import schedule
import time
def weekday_job():
print("Przypomnienie robocze: nie zapomnij przygotować raportu!")
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)
W tym przypadku o 8 rano każdego dnia roboczego dostaniesz przypomnienie o przygotowaniu raportu. Dzięki temu twój skrypt zawsze będzie pilnował harmonogramu, nawet jeśli o tym zapomnisz.
3. Konfigurowanie tygodniowych zadań
A co, jeśli chcesz otrzymywać przypomnienie w każdą niedzielę? Powiedzmy, że chcesz sprawdzić zapasy kawy przed tygodniem pracy. Zobaczmy, jak to zrobić:
import schedule
import time
def sunday_job():
print("Przypomnienie: sprawdź zapasy kawy na przyszły tydzień!")
schedule.every().sunday.at("18:00").do(sunday_job)
while True:
schedule.run_pending()
time.sleep(1)
Ten niewielki fragment kodu wprowadzi porządek do twojej niedzieli, przypominając ci o przygotowaniu się na nadchodzący tydzień. Teraz twoja kawa nigdy nie skończy się w najmniej oczekiwanym momencie. Tak, wiem, że to może być tragedia dla wielu.
4. Zmiana zadań
Usuwanie zadań z harmonogramu
Jeśli trzeba usunąć zadanie, można skorzystać z metody cancel_job(). Na przykład, aby usunąć zadanie z harmonogramu, można uzyskać obiekt zadania i wywołać dla niego cancel_job().
job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job) # Usunięcie zadania z harmonogramu
Przenoszenie zadania
Aby zmienić czas wykonywania zadania, można ponownie przypisać harmonogram. Na przykład, jeśli zadanie było zaplanowane na 9:00, ale teraz musi zostać przesunięte na 10:00, możemy zaktualizować jego harmonogram.
# Planujemy zadanie na każdy dzień o 9:00
job = schedule.every().day.at("09:00").do(my_task)
# Przenosimy zadanie na 10:00
job.clear() # Czyszczenie obecnego harmonogramu zadania
job.at("10:00") # Przeniesienie na nowy czas
Sprawdzanie aktywnych zadań
Aby sprawdzić, czy są zaplanowane zadania, można wyświetlić listę wszystkich aktywnych zadań za pomocą schedule.jobs. To przydatne, gdy chcemy uzyskać informacje o wszystkich zadaniach znajdujących się w harmonogramie.
# Dodajemy kilka zadań
schedule.every().day.at("09:00").do(my_task)
schedule.every().monday.at("10:00").do(my_task)
# Przegląd wszystkich aktywnych zadań
for job in schedule.jobs:
print("Zadanie:", job)
Usuwanie wszystkich zadań z harmonogramu
Jeśli trzeba wyczyścić harmonogram i usunąć wszystkie zaplanowane zadania, można użyć metody clear().
# Planujemy kilka zadań
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)
# Czyszczenie harmonogramu
schedule.clear()
Wykonanie zadania tylko raz
Czasami trzeba wykonać zadanie tylko raz w określonym czasie. Po wykonaniu takiego zadania można użyć metody schedule.cancel_job(job), aby je anulować.
def one_time_task():
print("Zadanie wykonane raz")
return schedule.CancelJob # Anulowanie zadania po wykonaniu
# Planowanie wykonania zadania raz
schedule.every().day.at("09:00").do(one_time_task)
while True:
schedule.run_pending()
time.sleep(1)
5. Realne scenariusze użycia
A teraz trochę poważniej: jak takie automatyzacje są stosowane w profesjonalnym środowisku? W rzeczywistości możesz używać harmonogramowania zadań do:
- Automatycznego zbierania danych każdego dnia lub tygodnia.
- Tworzenia i wysyłania raportów w określony dzień i godzinę.
- Monitorowania stanu serwera lub interfejsu webowego, z powiadomieniami o błędach.
- Uruchamiania regularnych backupów bazy danych.
Typowe błędy
Kiedy zajmujesz się harmonogramowaniem zadań, uważaj na niesynchronizowany czas, na przykład, jeśli twój serwer i komputer lokalny są w różnych strefach czasowych. Również, jeśli twój skrypt przypadkiem zakończy się, zaplanowane zadania nie zostaną wykonane. Używaj narzędzi do monitorowania, takich jak cron (dla systemów Unix-like) lub Windows Task Scheduler.
Jeśli przypadkiem zapomnisz dodać time.sleep(1) na końcu swojej pętli, otrzymasz proces, który będzie obciążał procesor bez końca, jak nadaktywny kod. Generalnie, nie zapominaj utrzymywać skryptu w odpowiednim stanie.
GO TO FULL VERSION