Kafayı yiyecektim arkadaşlar. Şaka gibi bir sorun. Uzun süre çalışması gereken, belirli aralıklarla bir API'den veri çekip veritabanına yazan bir script yazdım. Tabii ki Python'da, tabii ki de schedule kütüphanesiyle. "Ne güzel, time.sleep()'le uğraşmıyorum" diye seviniyordum. Terminalde çalıştırıyorum, mükemmel gidiyor. Ta ki bilgisayarımı kapatmayıp, sadece ekranı kapattığım veya uyku moduna geçirdiğim ana kadar.
Uyandığımda Felaket
Sabah bilgisayarı açtım, terminale baktım. Script çalışıyor gibi görünüyor ama son log satırı 6 saat önceydi! Meğerse bilgisayar uykuya geçince işletim sistemi tüm prosesleri donduruyormuş. Schedule'ın timer'ı da, threading'i de, her şeyi askıya alınıyor. Uyandığında kaldığı yerden devam etmiyor, o anki schedule planına göre devam ediyor. Yani 6 saatte 20 kere çalışması gereken işlem, sadece 1 kere çalışmış oluyor. Veri kaybı resmen.
Çözüm Arayışı ve İlk Çırpınışlar
İlk aklıma gelen, "acaba schedule'ın run_pending() döngüsünü bir thread'e alsam?" oldu. Denedim, olmadı. İşletim sistemi uykuya geçince thread de duruyor.
StackOverflow'da bile direk çözüm bulamadım. Meğerse sorun, bu işin kullanıcı seviyesindeki bir kütüphaneyle değil, işletim sisteminin gerçek zamanlı servisleriyle (cron daemon gibi) yapılması gerektiğiymiş.
Gerçek Çözüm: Doğru Aracı Seçmek
Eğer script'inizin bilgisayar kapalı/uykuda olsa bile çalışmaya devam etmesini istiyorsanız, schedule veya benzeri kütüphaneler YEREL GELİŞTİRME ve TEST için. Canlıya alacaksanız:
- Windows için: Görev Zamanlayıcı (Task Scheduler)
- Linux/macOS için: Gerçek cron ya da systemd timers
Ben Linux'ta çalıştığım için, script'in başına shebang ekleyip çalıştırma izni verdikten sonra, crontab -e diyerek aşağıdaki gibi ekledim:
Böylece işletim sisteminin kendi zamanlayıcısı, bilgisayar uyandığında "aa, uyku sırasında kaçırdığın şu işleri yapman lazım" diyerek (eğer ayarlanırsa) telafi edebiliyor veya en azından uyku sırasında durmuyor.
Sonuç? Bazen en sevdiğimiz basit Python kütüphaneleri, problemi çözmek için doğru araç olmayabiliyor. "Python'la her şey olur" demek kadar tehlikeli bir şey yok. Siz de böyle "meğerse kütüphane değil, sistem servisi kullanmam gerekiyormuş" diye yandığınız oldu mu? Windows'ta Görev Zamanlayıcı ile ilgili tüyoları olan var mı?
Sabah bilgisayarı açtım, terminale baktım. Script çalışıyor gibi görünüyor ama son log satırı 6 saat önceydi! Meğerse bilgisayar uykuya geçince işletim sistemi tüm prosesleri donduruyormuş. Schedule'ın timer'ı da, threading'i de, her şeyi askıya alınıyor. Uyandığında kaldığı yerden devam etmiyor, o anki schedule planına göre devam ediyor. Yani 6 saatte 20 kere çalışması gereken işlem, sadece 1 kere çalışmış oluyor. Veri kaybı resmen.
İlk aklıma gelen, "acaba schedule'ın run_pending() döngüsünü bir thread'e alsam?" oldu. Denedim, olmadı. İşletim sistemi uykuya geçince thread de duruyor.
Python:
import schedule
import time
from threading import Thread
def job():
print("Çalışıyor...")
schedule.every(10).minutes.do(job)
def run_scheduler():
while True:
schedule.run_pending()
time.sleep(1)
Thread(target=run_scheduler).start()
# Uyku modu bu kodu da ezer geçer!
StackOverflow'da bile direk çözüm bulamadım. Meğerse sorun, bu işin kullanıcı seviyesindeki bir kütüphaneyle değil, işletim sisteminin gerçek zamanlı servisleriyle (cron daemon gibi) yapılması gerektiğiymiş.
Eğer script'inizin bilgisayar kapalı/uykuda olsa bile çalışmaya devam etmesini istiyorsanız, schedule veya benzeri kütüphaneler YEREL GELİŞTİRME ve TEST için. Canlıya alacaksanız:
- Windows için: Görev Zamanlayıcı (Task Scheduler)
- Linux/macOS için: Gerçek cron ya da systemd timers
Ben Linux'ta çalıştığım için, script'in başına shebang ekleyip çalıştırma izni verdikten sonra, crontab -e diyerek aşağıdaki gibi ekledim:
Bash:
/10 /home/bingunluk/venv/bin/python /home/bingunluk/scripts/benim_muhtesem_scriptim.py
Böylece işletim sisteminin kendi zamanlayıcısı, bilgisayar uyandığında "aa, uyku sırasında kaçırdığın şu işleri yapman lazım" diyerek (eğer ayarlanırsa) telafi edebiliyor veya en azından uyku sırasında durmuyor.
Sonuç? Bazen en sevdiğimiz basit Python kütüphaneleri, problemi çözmek için doğru araç olmayabiliyor. "Python'la her şey olur" demek kadar tehlikeli bir şey yok. Siz de böyle "meğerse kütüphane değil, sistem servisi kullanmam gerekiyormuş" diye yandığınız oldu mu? Windows'ta Görev Zamanlayıcı ile ilgili tüyoları olan var mı?