Celery va Redis Bilan Django-da Asinxron Vazifalar: Amaliy Dars

Muallif: Javohir Abdullayev · · Django

Celery va Redis Bilan Django-da Asinxron Vazifalar: Amaliy Dars

Kirish: Nega Django Loyihalarida Asinxronlik Zarur?

Veb-ilovalarda foydalanuvchi tajribasi (UX) va tizimning javob berish tezligi muvaffaqiyatning asosiy omillaridan biridir. Tasavvur qiling, foydalanuvchi ro'yxatdan o'tgach, unga tasdiqlash xati yuboriladi yoki katta hajmdagi PDF hisobot generatsiya qilinadi. Agar ushbu amallar to'g'ridan-to'g'ri Django so'rov-javob (request-response) siklida bajarilsa, foydalanuvchi bir necha soniya davomida sahifa yuklanishini kutishga majbur bo'ladi.

Ushbu muammoni hal qilishning eng samarali yo'li — og'ir va vaqt oluvchi jarayonlarni orqa fonga (background task) o'tkazishdir. Ushbu amaliy qo'llanmada biz Celery va Redis vositalari yordamida Django ilovasida asinxron vazifalarni bajarishni noldan boshlab o'rganamiz.

Kerakli Texnologiyalar va Arxitektura

Loyihamizda uchta asosiy komponent birgalikda ishlaydi:

  • Django: Asosiy veb-freymvork va API logikasi.
  • Redis: Xabarlar brokeri (message broker) sifatida vazifalarni navbatda (queue) saqlaydi.
  • Celery: Asinxron vazifalarni qabul qilib, ularni orqa fonda bajaruvchi vosita (worker).

1-qadam: Kutubxonalarni O'rnatish

Loyihangizning virtual muhitiga (venv) quyidagi paketlarni o'rnating:

pip install django celery redis

Shuningdek, kompyuteringizda yoki serveringizda Redis serveri o'rnatilgan va ishlayotgan bo'lishi kerak. Uni tekshirish uchun terminalda quyidagi buyruqni kiriting:

redis-cli ping
# Javob: PONG

2-qadam: Django Loyihasida Celery-ni Sozlash

Aytaylik, loyihamiz nomi config deb ataladi. Loyihaning asosiy papkasida (settings.py joylashgan joyda) yangi celery.py faylini yarating:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

app = Celery('config')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

Keyin, xuddi shu papkadagi __init__.py fayliga Celery ilovasini eksport qilamiz:

from .celery import app as celery_app

__all__ = ('celery_app',)

3-qadam: settings.py Fayliga Redis Sozlamalarini Qo'shish

Celery qaysi broker orqali ulanishini bilishi uchun settings.py faylining oxiriga quyidagi sozlamalarni yozing:

CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Tashkent'

4-qadam: Asinxron Vazifa (Task) Yaratish

Endi o'zingizning ilovangizda (masalan, notifications ilovasida) tasks.py faylini oching va namunaviy vazifani yozing:

from celery import shared_task
import time

@shared_task
def send_welcome_email(user_email):
    # Simulyatsiya: xat yuborish 5 soniya vaqt oladi
    time.sleep(5)
    print(f"{user_email} manziliga xush kelibsiz xati yuborildi!")
    return f"Xat muvaffaqiyatli yuborildi: {user_email}"

5-qadam: Vazifani View Orqali Chaqirish

Ushbu vazifani oddiy funksiya kabi chaqirmasdan, .delay() metodi yordamida orqa fonga yo'naltiramiz:

from django.http import JsonResponse
from .tasks import send_welcome_email

def register_user_view(request):
    user_email = request.GET.get('email', 'foydalanuvchi@pycoder.uz')
    # Asinxron vazifani navbatga yuboramiz
    send_welcome_email.delay(user_email)
    
    return JsonResponse({
        'status': 'success',
        'message': 'Foydalanuvchi qabul qilindi, xat orqa fonda yuborilmoqda!'
    })

6-qadam: Celery Worker-ni Ishga Tushirish

Tizim to'liq ishlashi uchun ikkita alohida terminal oynasidan foydalanamiz. Birinchi terminalda Django serverini ishga tushiring:

python manage.py runserver

Ikkinchi terminalda Celery worker jarayonini yoqing:

celery -A config worker -l info

Endi brauzer orqali ko'rsatilgan view manziliga so'rov yuborganingizda, foydalanuvchi zudlik bilan (bir necha millisoniyada) javob oladi, 5 soniyalik og'ir amal esa Celery worker oynasida mustaqil bajariladi.

Xulosa va Eng Yaxshi Amaliyotlar

Celery va Redis juftligi Django loyihalarini masshtablash (scaling) va yuqori yuklamalarga chidamli qilishning eng ishonchli usulidir. Real loyihalarda har doim quyidagilarga e'tibor bering:

  • Vazifalar idempotent (takrorlanganda tizimga zarar yetkazmaydigan) bo'lishi kerak.
  • Katta ob'ektlarni (masalan, Django Model nusxalarini) task argumenti sifatida emas, balki faqat ID raqamini (primary key) uzating.
  • Xatoliklarni boshqarish uchun autoretry_for parametrlaridan foydalaning.

Teglar: #Django #Celery #Redis #Backend #Python