Gereksinimler ve Ön Hazırlık
Çalışmalarımıza başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalıyız. Python 3.9 ve üzeri bir sürüm kullanmanız, güncel kütüphane destekleri ve performans iyileştirmeleri açısından önerilir. İlk adım olarak, projenizin dizininde terminal veya komut satırı üzerinden gerekli kütüphaneyi yüklemeniz gerekmektedir.
pip install schedule
Kurulum tamamlandıktan sonra, kütüphanenin yüklendiğini doğrulamak için boş bir Python dosyası oluşturup import schedule komutunu çalıştırabilirsiniz. Eğer herhangi bir hata almıyorsanız, sisteminiz otomasyon görevlerini yönetmeye hazırdır.
Temel Zamanlayıcı Yapısı ve İlk Görev
Schedule kütüphanesinin çalışma mantığı, bir döngü içerisinde zamanı kontrol etmek ve tanımlanan süre dolduğunda ilgili fonksiyonu tetiklemek üzerine kuruludur. Aşağıdaki örnekte, her 10 saniyede bir konsola mesaj yazdıran basit bir yapıyı inceleyelim.
import schedule
import time
def gorev():
print("Görev başarıyla çalıştırıldı!")
# Her 10 saniyede bir gorev fonksiyonunu çalıştır
schedule.every(10).seconds.do(gorev)
while True:
schedule.run_pending()
time.sleep(1)
Burada schedule.run_pending() fonksiyonu, zamanı gelen tüm görevleri kontrol eder ve çalıştırır. time.sleep(1) ise işlemcinin gereksiz yere yorulmaması için döngüyü 1 saniye bekletir.
Farklı Zaman Aralıkları ile Çalışma
Schedule kütüphanesi, sadece saniyelerle sınırlı değildir; dakikalar, saatler, günler ve haftalık periyotlar için de oldukça sezgisel bir sözdizimi sunar. Aşağıdaki kod bloğu, farklı zamanlama senaryolarının nasıl tanımlanacağını göstermektedir.
import schedule
def saatlik_is():
print("Saatlik rapor oluşturuluyor...")
def gunluk_is():
print("Günlük yedekleme başladı.")
# Her 1 saatte bir çalıştır
schedule.every().hour.do(saatlik_is)
# Her gün belirli bir saatte çalıştır
schedule.every().day.at("10:30").do(gunluk_is)
# Her Pazartesi çalıştır
schedule.every().monday.do(gunluk_is)
Bu yöntemle, uygulamanızın ihtiyaçlarına göre çoklu görevleri tek bir script içerisinde yönetebilirsiniz. Özellikle .at() metodu, günlük görevlerin tam olarak istediğiniz saatte başlamasını sağlar.
Zamanlanmış Görevlerde Parametre Kullanımı
Gerçek dünya uygulamalarında, fonksiyonlarınıza dışarıdan veri aktarmanız gerekebilir. Schedule kütüphanesi, do() metodu içerisinde parametre göndermenize izin verir. Bu, kodun tekrar kullanılabilirliğini artırır.
import schedule
def kullanici_selamla(isim):
print(f"Merhaba {isim}, görev zamanı geldi!")
# Parametreli fonksiyonu zamanlama
schedule.every(5).seconds.do(kullanici_selamla, isim="Ahmet")
Bu örnekte, do metodundan sonra eklediğiniz her argüman, doğrudan hedef fonksiyonunuza iletilir. Bu sayede aynı fonksiyonu farklı verilerle farklı zamanlarda çalıştırabilirsiniz.
Hata Yönetimi ve Loglama
Zamanlanmış görevler uzun süre arka planda çalışacağı için, olası hataları yakalamak ve süreci izlemek hayati önem taşır. Görevlerinizin içine try-except blokları ekleyerek uygulamanın çökmesini engelleyebilirsiniz.
import schedule
import logging
logging.basicConfig(level=logging.INFO)
def kritik_gorev():
try:
# Veritabanı işlemi veya API çağrısı
print("İşlem yapılıyor...")
except Exception as e:
logging.error(f"Hata oluştu: {e}")
schedule.every(1).minute.do(kritik_gorev)
Kritik Uyarı: Üretim ortamlarında (production) zamanlayıcıları çalıştırırken, uygulamanızın beklenmedik bir hata sonucu durması durumunda süreci otomatik olarak yeniden başlatacak sistem servisleri (Linux için Systemd veya Docker restart policy) kullanmanız önerilir.
Zamanlama Yöntemlerinin Karşılaştırılması
Python projelerinde görev zamanlamak için farklı yaklaşımlar mevcuttur. İhtiyacınıza en uygun olanı seçmek için aşağıdaki tabloyu inceleyebilirsiniz.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Schedule Kütüphanesi | Okunabilir, basit, Python içi | Uygulama kapanırsa durur |
| Linux Cron | Sistem seviyesinde, kararlı | Python dışında konfigürasyon gerektirir |
| Celery + Redis | Dağıtık sistemler için ölçeklenebilir | Karmaşık kurulum gerektirir |
Sıkça Sorulan Sorular
Schedule kütüphanesi çoklu iş parçacığı (threading) destekler mi?
Evet, ancak varsayılan olarak görevler sırayla çalışır. Eğer bir görevin uzun sürmesi diğerlerini geciktiriyorsa, Python'ın threading modülünü kullanarak her görevi ayrı bir iş parçacığında çalıştırabilirsiniz.
Uygulama kapandığında zamanlayıcılar çalışmaya devam eder mi?
Hayır, schedule kütüphanesi Python süreci (process) içerisinde yaşar. Uygulama veya sunucu kapandığında zamanlayıcılar da durur. Süreklilik için uygulamayı bir arka plan servisi olarak çalıştırmalısınız.
Aynı anda birden fazla görevi nasıl iptal ederim?
schedule.clear() komutu ile tüm görevleri, schedule.cancel_job(job) ile ise belirli bir görevi iptal edebilirsiniz.
Schedule ile veritabanı bağlantısı kurarken nelere dikkat etmeliyim?
Her görev içerisinde veritabanı bağlantısını açıp kapatmak yerine, bağlantı havuzu (connection pooling) kullanmalı ve bağlantıların zaman aşımına uğramadığından emin olmalısınız.
Zamanlanmış görevlerimi nasıl loglayabilirim?
Python'ın dahili logging kütüphanesini kullanarak görevlerin başlangıç, bitiş ve hata durumlarını bir dosyaya yazdırarak izleme yapabilirsiniz.
Güvenlik Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Zamanlanmış görevlerinizde hassas veriler (API anahtarları, veritabanı şifreleri) kullanıyorsanız, bunları kod içerisine gömmeyin; ortam değişkenlerini (environment variables) veya güvenli kasa (vault) çözümlerini tercih edin.
Schedule Kütüphanesi İçin İleri Düzey Performans İpuçları
Schedule kütüphanesi, doğası gereği senkron bir yapıya sahiptir. Bu, görevlerinizden biri uzun sürerse veya bir ağ isteği (network request) beklerse, diğer görevlerin zamanlamasının gecikebileceği anlamına gelir. Performansı optimize etmek ve zamanlayıcının "donmasını" engellemek için şu stratejileri uygulayabilirsiniz:
Görevleri Asenkron Hale Getirme
Eğer zamanlanmış görevlerinizden biri veritabanı sorgusu veya dosya okuma gibi zaman alan işlemler içeriyorsa, bu görevi ayrı bir iş parçacığında (thread) çalıştırmak en sağlıklı yöntemdir. Böylece ana döngü (main loop) kesintiye uğramaz.
import schedule
import time
import threading
def uzun_suren_gorev():
print("İşlem başlıyor...")
time.sleep(10) # 10 saniyelik bir gecikme
print("İşlem tamamlandı.")
def gorevi_calistir():
thread = threading.Thread(target=uzun_suren_gorev)
thread.start()
# Görevi her 1 dakikada bir tetiklemek için thread başlat
schedule.every(1).minutes.do(gorevi_calistir)
while True:
schedule.run_pending()
time.sleep(1)
Zamanlayıcıyı İzleme ve Hata Ayıklama
Karmaşık projelerde hangi görevin ne zaman çalıştığını veya bir görevin neden başarısız olduğunu takip etmek zorlaşabilir. schedule.get_jobs() metodunu kullanarak o anki tüm görevleri listeleyebilir ve durumlarını kontrol edebilirsiniz.
import schedule
def ornek_gorev():
print("Görev çalışıyor.")
schedule.every().day.at("10:00").do(ornek_gorev)
# Tüm görevleri listeleyelim
tum_gorevler = schedule.get_jobs()
for gorev in tum_gorevler:
print(f"Görev: {gorev.job_func.__name__}, Sonraki çalışma: {gorev.next_run}")
Üretim Ortamına (Deployment) Geçiş Stratejileri
Geliştirme ortamında çalışan bir script, sunucu ortamında farklı gereksinimler doğurur. Uygulamanızın sunucuda sürekli ayakta kalması için "Process Manager" araçlarını kullanmanız önerilir.
Systemd ile Servis Olarak Çalıştırma
Linux sunucularda Python scriptinizi bir servis olarak tanımlamak, uygulama çöktüğünde otomatik olarak yeniden başlatılmasını sağlar. Aşağıdaki örnek bir .service dosyası yapısını temsil eder:
[Unit]
Description=Python Zamanlayici Servisi
After=network.target
[Service]
User=kullanici_adi
WorkingDirectory=/var/www/proje
ExecStart=/usr/bin/python3 /var/www/proje/main.py
Restart=always
[Install]
WantedBy=multi-user.target
Deployment İçin Dikkat Edilmesi Gerekenler
- Zaman Dilimi (Timezone): Sunucunuzun yerel saati ile kodunuzun beklediği saat dilimi farklı olabilir. Her zaman UTC kullanmanız ve loglarda bunu belirtmeniz önerilir.
- Bellek Yönetimi: Uzun süre çalışan scriptlerde bellek sızıntılarını (memory leak) kontrol edin. Gerekirse belirli aralıklarla scripti yeniden başlatan bir mekanizma kurun.
- Log Rotasyonu: Log dosyalarınızın disk alanını doldurmaması için
logging.handlers.RotatingFileHandlerkullanarak log dosyalarını belirli boyutlarda parçalara ayırın.
Sonuç
Python ile schedule kütüphanesi kullanarak zamanlanmış görev nasıl yapılır sorusunu, temel kurulumdan hata yönetimine kadar detaylandırdık. Bu kütüphane, özellikle küçük ve orta ölçekli projelerde otomasyon ihtiyaçlarını karşılamak için oldukça güçlü ve pratiktir. Bir sonraki adım olarak, bu görevleri bir Docker konteyneri içerisine alarak sunucunuzda 7/24 kesintisiz çalışacak şekilde yapılandırmayı deneyebilirsiniz. Yazılım geliştirme yolculuğunuzda otomasyon, verimliliğinizi artıracak en güçlü araçlardan biridir.


Yorumlar (0)
Yorum Yaz