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 rq

Redis 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ı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import time
2from redis import Redis
3from rq import Queue
4
5redis_conn = Redis()
6queue = Queue(connection=redis_conn)
7
8def send_email(email, subject):
9"""Simüle edilmiş e-posta gönderimi"""
10time.sleep(3) # Uzun işlem simülasyonu
11return f"E-posta {email}'e gönderildi: {subject}"
12
13def process_file(filename):
14"""Dosya işleme görevi"""
15time.sleep(2)
16return f"{filename} işlendi"
17
18# Görevleri kuyruğa ekle
19if __name__ == "__main__":
20job1 = queue.enqueue(send_email, "user@example.com", "Hoş geldin")
21job2 = queue.enqueue(process_file, "data.csv")
22
23print(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 Redis
2from rq import Worker, Queue
3
4redis_conn = Redis()
5queue = Queue(connection=redis_conn)
6worker = Worker([queue], connection=redis_conn)
7
8if __name__ == "__main__":
9worker.work()

Worker'ı başlat:

1python worker.py

Ayrı bir terminal'de görevleri kuyruğa ekle:

1python tasks.py

Beklenen çı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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz