Celery va Redis Bilan Django-da Asinxron Vazifalar: Amaliy Dars
Muallif: Javohir Abdullayev · · Django

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 redisShuningdek, kompyuteringizda yoki serveringizda Redis serveri o'rnatilgan va ishlayotgan bo'lishi kerak. Uni tekshirish uchun terminalda quyidagi buyruqni kiriting:
redis-cli ping
# Javob: PONG2-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 runserverIkkinchi terminalda Celery worker jarayonini yoqing:
celery -A config worker -l infoEndi 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_forparametrlaridan foydalaning.
Teglar: #Django #Celery #Redis #Backend #Python