Asosiy kontentga o‘tish

Maqolalar

Darslik · 2025-11-22 · ~2 daqiqa o‘qiladi · o'rta

Celery bilan fon vazifalarni bajarish

#backend #python #celery

Mundarija

Foydalanuvchi tugmani bosdi, sizga esa email yuborish, rasmni qayta ishlash yoki hisobot tayyorlash kerak. Bularni so‘rov ichida qilsangiz, foydalanuvchi soniyalab kutadi. Yechim — bu ishlarni fonga o‘tkazish. Bu yerda Celery yordam beradi.

Ish qanday oqadi#

  1. Web-ilova vazifani navbatga (broker, odatda Redis) qo‘yadi
  2. Foydalanuvchiga darhol javob qaytaradi
  3. Alohida worker jarayoni navbatdan vazifani oladi va bajaradi

Foydalanuvchi kutmaydi, ish esa fonda bajariladi.

Sodda misol#

from celery import Celery

app = Celery("tasks", broker="redis://localhost:6379/0")

@app.task
def send_welcome_email(user_id):
    user = get_user(user_id)
    send_email(user.email, "Xush kelibsiz!")

Web-ilovada uni chaqirish:

send_welcome_email.delay(user.id)  # darhol qaytadi, ish fonda

.delay() — vazifani navbatga qo‘yadi va zudlik bilan qaytadi. Email esa worker tomonidan yuboriladi.

Worker'ni ishga tushirish#

celery -A tasks worker --loglevel=info

Qachon ishlatish kerak#

  • Email/SMS yuborish — tashqi servis sekin bo‘lishi mumkin
  • Rasm/video qayta ishlash — CPU'ni ko‘p oladi
  • Hisobot generatsiya — uzoq davom etadi
  • Rejalashtirilgan vazifalar (Celery Beat bilan) — har kuni backup, tozalash

Ehtiyot bo‘lish kerak bo‘lgan joylar#

  • Vazifalar idempotent bo‘lsin — qayta bajarilsa ham zarar bo‘lmasin (worker qayta urinishi mumkin).
  • Vazifaga ob'ekt emas, ID uzating — ma'lumot vazifa bajarilgunga eskirmasligi uchun.
  • Xatolarni kuzating — worker jimgina yiqilishi mumkin, monitoring qo‘ying.

Celery — Python backend'da fon vazifalar uchun standart yechim. Ilova o‘sganda u deyarli muqarrar kerak bo‘ladi.