Redis ve Worker Prosesleri ile Asenkron İş Kuyruğu
Uzun süren işleri hemen tamamlamak yerine kuyruğa almak ve arka planda işlemek istiyorsan, Redis + Python worker kombinasyonu en pratik çözüm. E-posta gönderimi, dosya işleme, API çağrıları gibi ağır görevleri ana uygulamadan ayırabilirsin.
Redis bir in-memory veri deposu olarak görev listesi tutarken, worker prosesleri bu görevleri alıp işler. kullanıcı hemen yanıt alır, işlem arka planda devam eder.
Kurulum için önce Redis'i ve gerekli Python kütüphanelerini yükle:
1pip install redis rqRedis sunucusunu başlat (Docker kullanıyorsan):
1docker run -d -p 6379:6379 redis:latestŞimdi basit bir örnek yazalım. İlk olarak görevleri tanımlayan `tasks.py` dosyası:
1import time2from redis import Redis3from rq import Queue45redis_conn = Redis()6queue = Queue(connection=redis_conn)78def send_email(email, subject):9"""Simüle edilmiş e-posta gönderimi"""10time.sleep(3) # Uzun işlem simülasyonu11return f"E-posta {email}'e gönderildi: {subject}"1213def process_file(filename):14"""Dosya işleme görevi"""15time.sleep(2)16return f"{filename} işlendi"1718# Görevleri kuyruğa ekle19if __name__ == "__main__":20job1 = queue.enqueue(send_email, "user@example.com", "Hoş geldin")21job2 = queue.enqueue(process_file, "data.csv")2223print(f"Job 1 ID: {job1.id}")24print(f"Job 2 ID: {job2.id}")Şimdi worker prosesini başlat. Ayrı bir terminal penceresinde `worker.py` çalıştır:
1from redis import Redis2from rq import Worker, Queue34redis_conn = Redis()5queue = Queue(connection=redis_conn)6worker = Worker([queue], connection=redis_conn)78if __name__ == "__main__":9worker.work()Worker'ı başlat:
1python worker.pyAyrı bir terminal'de görevleri kuyruğa ekle:
1python tasks.pyBeklenen çıktı: Worker terminal'inde görevlerin işlendiğini görürsün. İşlem bitince job durumu "finished" olur.
Sık hatalar: Redis'e bağlantı kuramıyorsan, Redis sunucusunun çalışıp çalışmadığını kontrol et. Worker sürekli çalışmalı; production'da `supervisord` veya `systemd` ile yönet. Görev sonucunu kontrol etmek için `job.get_status()` ve `job.result` kullan.
0 yorum