Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. BackgroundTasks nima
- 2.2. add_task bilan qo'shish
- 2.3. Qachon ishlatiladi
- 2.4. Bir necha fon vazifasi
- 2.5. Bog'liqlik bilan fon vazifasi
- 2.6. BackgroundTasks cheklovlari
- 2.7. Navbat tizimi (og'ir ishlar uchun)
- 2.8. Fon vazifasida xato
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — BackgroundTasks asoslari
- Misol 2 — Bir necha vazifa va argumentlar
- Misol 3 — Bog'liqlik bilan fon va xato
- Misol 4 — Amaliy: fon vazifalari va cheklovlar
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
20.14-dars: Fon vazifalari
20-QISM — WEB-BACKEND (FastAPI) · 14-dars
1. Kirish va motivatsiya
Ba'zi ishlar vaqt oladi: email yuborish, rasm qayta ishlash, hisobot yaratish, tashqi xizmatga so'rov. Agar endpoint bularni kutsa, foydalanuvchi javobni kutib turadi — sekin, yomon tajriba. Yechim — bu ishlarni fonda bajarish: foydalanuvchiga darrov javob berib, og'ir ishni keyin qilishdir.
Bu darsda FastAPI'ning BackgroundTasks ni o'rganamiz — javob yuborilgandan keyin ishni bajarish. Foydalanuvchi darrov javob oladi ("ro'yxatdan o'tdingiz"), email esa fonda yuboriladi. Bu — javob tezligi va foydalanuvchi tajribasi uchun muhim naqsh.
Real vaziyat. Bir API ro'yxatdan o'tishda tasdiqlovchi email yuborardi — lekin email xizmati sekin (2-3 soniya), foydalanuvchi har safar kutardi. Ba'zan email xizmati javob bermasa, butun ro'yxatdan o'tish muvaffaqiyatsiz bo'lardi (email tufayli!). Jamoa emailni BackgroundTasksga o'tkazdi: foydalanuvchi darrov javob oladi, email fonda ketadi. Ro'yxatdan o'tish tezlashdi va email nosozligi uni to'xtatmaydi. Foydalanuvchi tajribasi yaxshilandi.
Bu darsda fon vazifalarini — BackgroundTasks, ishlatilishi va cheklovlarini o'rganamiz.
Bu darsda:
-
BackgroundTasks— javobdan keyin ish -
add_taskbilan vazifa qo'shish - Ishlatilish (email, log, tozalash)
- Bir necha fon vazifasi
- Argumentlar bilan vazifa
- Bog'liqlik bilan fon vazifasi
- Cheklovlar (
BackgroundTasksvs navbat) - Amaliy: to'liq fon tizimi
ℹ Misollarda FastAPI
TestClientbilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. BackgroundTasks nima
BackgroundTasks — javob yuborilgandan keyin bajariladigan ishlar:
from fastapi import BackgroundTasks
def email_yubor(manzil: str):
... # sekin ish
@app.post("/royxat")
def royxat(ism: str, fon: BackgroundTasks):
fon.add_task(email_yubor, f"{ism}@mail.uz")
return {"holat": "ro'yxatdan o'tdi"} # darrov qaytadi| Qadam | Vaqt |
|---|---|
| Endpoint ishlaydi | So'rov |
return |
Javob yuboriladi |
| Fon vazifasi | Javobdan keyin |
BackgroundTasks — javob darrov qaytadi, fon vazifasi keyin ishlaydi. Foydalanuvchi og'ir ishni kutmaydi. Endpointga fon: BackgroundTasks parametr sifatida qo'shiladi.
2.2. add_task bilan qo'shish
add_task(funksiya, *args, **kwargs) — vazifa qo'shadi:
fon.add_task(email_yubor, "ali@mail.uz") # pozitsion arg
fon.add_task(log_yoz, xabar="kirdi", daraja="info") # nomli arg add_task — funksiya va uning argumentlarini oladi (chaqirmaydi!). FastAPI javobdan keyin funksiyani shu argumentlar bilan chaqiradi. Funksiya def yoki async def bo'lishi mumkin.
2.3. Qachon ishlatiladi
Fon vazifasi — javob uchun kerak bo'lmagan, lekin bajarilishi kerak ishlar:
| Ish | Nima uchun fonda |
|---|---|
| Email yuborish | Sekin, javob kutmaslik |
| Log/audit yozish | Javobga ta'sir qilmaydi |
| Kesh yangilash | Keyin bo'lsa ham mayli |
| Vaqtincha fayl tozalash | So'rovdan keyin |
| Bildirishnoma | Darhol kerak emas |
Fon vazifasi — natijasi foydalanuvchiga darhol kerak bo'lmagan ishlar. Javob tez qaytadi, ish keyin bajariladi.
2.4. Bir necha fon vazifasi
Bir endpointda bir necha vazifa (tartibda bajariladi):
@app.post("/royxat")
def royxat(ism: str, fon: BackgroundTasks):
fon.add_task(log_yoz, f"{ism} ro'yxatdan o'tdi")
fon.add_task(email_yubor, f"{ism}@mail.uz")
fon.add_task(statistika_yangila)
return {"holat": "ok"} Bir necha add_task — vazifalar qo'shilgan tartibda ketma-ket bajariladi (javobdan keyin). Har biri alohida ish.
2.5. Bog'liqlik bilan fon vazifasi
BackgroundTasks bog'liqlik 20.7-bob ichida ham ishlaydi:
def log_bilan(fon: BackgroundTasks):
fon.add_task(log_yoz, "so'rov keldi")
return fon
@app.get("/kurslar")
def kurslar(fon: Annotated[BackgroundTasks, Depends(log_bilan)]):
...Bog'liqlikda qo'shilgan fon vazifasi ham javobdan keyin ishlaydi. Bu umumiy fon ishlari (har so'rovni log qilish) uchun qulay.
2.6. BackgroundTasks cheklovlari
BackgroundTasks — oddiy, lekin cheklangan:
| Xususiyat | BackgroundTasks |
|---|---|
| Joyi | Shu server jarayonida |
| Ishonchlilik | Server o'chsa — yo'qoladi |
| Og'irlik | Yengil ish uchun |
| Kuzatuv | Yo'q (holat ko'rinmaydi) |
BackgroundTasks — yengil, tez ishlar uchun (email, log). Og'ir, uzoq yoki ishonchli bo'lishi kerak ishlar (to'lov, video qayta ishlash) uchun — navbat tizimi (Celery, RQ, message queue) kerak. BackgroundTasks server jarayonida ishlaydi — server o'chsa, vazifa yo'qoladi.
2.7. Navbat tizimi (og'ir ishlar uchun)
Katta/ishonchli ishlar uchun alohida navbat:
| Xususiyat | BackgroundTasks |
Navbat (Celery/RQ) |
|---|---|---|
| Joyi | Server jarayoni | Alohida ishchi |
| Ishonchlilik | Past | Yuqori (qayta urinish) |
| Kuzatuv | Yo'q | Bor (holat, natija) |
| Og'irlik | Yengil | Og'ir |
| Murakkablik | Oddiy | Murakkab (broker kerak) |
Navbat tizimi — vazifani alohida ishchiga (worker) beradi, holatni kuzatadi, xato bo'lsa qayta urinadi. Murakkab, lekin ishonchli. Tanlov: yengil → BackgroundTasks; og'ir/ishonchli → navbat.
2.8. Fon vazifasida xato
Fon vazifasidagi xato javobga ta'sir qilmaydi (javob allaqachon yuborilgan):
def xato_bilan():
raise ValueError("fon xatosi") # javob allaqachon ketgan
@app.post("/x")
def ep(fon: BackgroundTasks):
fon.add_task(xato_bilan)
return {"ok": True} # 200 qaytadi (xato keyin) Fon vazifasida xato — javob allaqachon yuborilgan, shuning uchun foydalanuvchi 200 oladi. Fon xatosini serverda log qiling (aks holda bilinmay qoladi). Muhim ishlar uchun navbat (kuzatuv bilan) yaxshiroq.
3. Tez ma'lumotnoma
from fastapi import BackgroundTasks
def email_yubor(manzil: str, mavzu: str):
... # sekin ish
@app.post("/royxat")
def royxat(ism: str, fon: BackgroundTasks):
fon.add_task(email_yubor, f"{ism}@mail.uz", "Xush kelibsiz") # argumentlar
fon.add_task(log_yoz, f"{ism} kirdi") # yana vazifa
return {"holat": "ok"} # darrov qaytadi, fon keyinQachon nima
yengil (email, log) → BackgroundTasks
og'ir/ishonchli (to'lov) → navbat (Celery, RQ)4. Batafsil misollar
Misollarda FastAPI
TestClientbilan sinaladi.
Misol 1 — BackgroundTasks asoslari
"""BackgroundTasks bilan javobdan keyin ish; add_task; javob darrov qaytadi; fon keyin bajariladi."""
import warnings
warnings.filterwarnings("ignore")
from fastapi import BackgroundTasks, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
JURNAL: list[str] = []
def log_yoz(xabar: str) -> None:
JURNAL.append(xabar)
@app.post("/hodisa")
def hodisa(nom: str, fon: BackgroundTasks):
fon.add_task(log_yoz, f"hodisa: {nom}")
return {"holat": "qabul qilindi", "nom": nom}
def main() -> None:
client = TestClient(app)
JURNAL.clear()
print("=== 1. So'rov — javob darrov ===")
javob = client.post("/hodisa?nom=kirish")
print(f" javob: {javob.json()}")
print("\n=== 2. Fon vazifasi bajarildi ===")
print(f" jurnal: {JURNAL}")
print("\n=== 3. Yana so'rov ===")
client.post("/hodisa?nom=chiqish")
print(f" jurnal: {JURNAL}")
print("\n=== 4. Tartib ===")
print(" 1) endpoint ishlaydi 2) javob yuboriladi 3) fon vazifasi")
print(f" jami {len(JURNAL)} fon vazifasi bajarildi")
print(" ⭐ BackgroundTasks — javob darrov, ish javobdan keyin")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. So'rov — javob darrov ===
javob: {'holat': 'qabul qilindi', 'nom': 'kirish'}
=== 2. Fon vazifasi bajarildi ===
jurnal: ['hodisa: kirish']
=== 3. Yana so'rov ===
jurnal: ['hodisa: kirish', 'hodisa: chiqish']
=== 4. Tartib ===
1) endpoint ishlaydi 2) javob yuboriladi 3) fon vazifasi
jami 2 fon vazifasi bajarildi
⭐ BackgroundTasks — javob darrov, ish javobdan keyinNima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — Bir necha vazifa va argumentlar
"""bir necha add_task (tartibda); pozitsion va nomli argumentlar; email + log + statistika; ro'yxatdan o'tish."""
import warnings
warnings.filterwarnings("ignore")
from fastapi import BackgroundTasks, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
JURNAL: list[str] = []
STATISTIKA = {"royxat_soni": 0}
def email_yubor(manzil: str, mavzu: str) -> None:
JURNAL.append(f"email→{manzil}: {mavzu}")
def log_yoz(xabar: str, daraja: str = "info") -> None:
JURNAL.append(f"[{daraja}] {xabar}")
def statistika_yangila() -> None:
STATISTIKA["royxat_soni"] += 1
@app.post("/royxat")
def royxat(ism: str, fon: BackgroundTasks):
fon.add_task(log_yoz, f"{ism} ro'yxatdan o'tdi")
fon.add_task(email_yubor, f"{ism}@mail.uz", "Xush kelibsiz")
fon.add_task(log_yoz, "email navbatga qo'yildi", daraja="debug")
fon.add_task(statistika_yangila)
return {"holat": "ro'yxatdan o'tdi", "ism": ism}
def main() -> None:
client = TestClient(app)
JURNAL.clear()
print("=== 1. Ro'yxatdan o'tish ===")
javob = client.post("/royxat?ism=ali")
print(f" javob: {javob.json()}")
print("\n=== 2. Fon vazifalari (tartibda) ===")
for j in JURNAL:
print(f" {j}")
print("\n=== 3. Nomli argument (daraja) ===")
print(f" debug xabar: {[j for j in JURNAL if 'debug' in j]}")
print("\n=== 4. Statistika yangilandi ===")
print(f" ro'yxat soni: {STATISTIKA['royxat_soni']}")
print(" ⭐ bir necha add_task — tartibda; pozitsion va nomli argument")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Ro'yxatdan o'tish ===
javob: {'holat': "ro'yxatdan o'tdi", 'ism': 'ali'}
=== 2. Fon vazifalari (tartibda) ===
[info] ali ro'yxatdan o'tdi
email→ali@mail.uz: Xush kelibsiz
[debug] email navbatga qo'yildi
=== 3. Nomli argument (daraja) ===
debug xabar: ["[debug] email navbatga qo'yildi"]
=== 4. Statistika yangilandi ===
ro'yxat soni: 1
⭐ bir necha add_task — tartibda; pozitsion va nomli argumentNima ko'rsatdi: 2.2, 2.3, 2.4-bo'limlar.
Misol 3 — Bog'liqlik bilan fon va xato
"""bog'liqlik ichida fon vazifasi (har so'rovni log); fon vazifasida xato javobga ta'sir qilmaydi; xatoni log qilish."""
import warnings
warnings.filterwarnings("ignore")
from typing import Annotated
from fastapi import BackgroundTasks, Depends, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
JURNAL: list[str] = []
def surov_logi(fon: BackgroundTasks) -> BackgroundTasks:
fon.add_task(JURNAL.append, "so'rov keldi")
return fon
def xavfsiz_ish() -> None:
try:
_ = 1 / 0 # xato
except ZeroDivisionError:
JURNAL.append("[xato] fon vazifasida nosozlik (log qilindi)")
@app.get("/kurslar")
def kurslar(fon: Annotated[BackgroundTasks, Depends(surov_logi)]):
return {"kurslar": ["Python", "Go"]}
@app.post("/ishla")
def ishla(fon: BackgroundTasks):
fon.add_task(xavfsiz_ish)
return {"holat": "boshlandi"}
def main() -> None:
client = TestClient(app)
JURNAL.clear()
print("=== 1. Bog'liqlik fon vazifasi ===")
javob = client.get("/kurslar")
print(f" javob: {javob.json()}")
print(f" jurnal: {JURNAL}")
print("\n=== 2. Har so'rov loglanadi ===")
client.get("/kurslar")
print(f" jami log: {len([j for j in JURNAL if 'keldi' in j])}")
print("\n=== 3. Fon vazifasida xato ===")
javob = client.post("/ishla")
print(f" javob status: {javob.status_code} (fon xatosi javobga ta'sir qilmadi)")
print("\n=== 4. Xato log qilindi ===")
print(f" {[j for j in JURNAL if 'xato' in j]}")
print(" ⭐ bog'liqlik fon; fon xatosi javobni buzmaydi (log qiling)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Bog'liqlik fon vazifasi ===
javob: {'kurslar': ['Python', 'Go']}
jurnal: ["so'rov keldi"]
=== 2. Har so'rov loglanadi ===
jami log: 2
=== 3. Fon vazifasida xato ===
javob status: 200 (fon xatosi javobga ta'sir qilmadi)
=== 4. Xato log qilindi ===
['[xato] fon vazifasida nosozlik (log qilindi)']
⭐ bog'liqlik fon; fon xatosi javobni buzmaydi (log qiling)Nima ko'rsatdi: 2.5, 2.8-bo'limlar.
Misol 4 — Amaliy: fon vazifalari va cheklovlar
Fon vazifasining real ishlatilishi — bildirishnoma tizimi: foydalanuvchi izoh qoldiradi, darrov javob oladi, va fonda bildirishnoma, log, statistika yangilanadi. Bu misol BackgroundTasks qachon mos, qachon navbat kerak ekanini ko'rsatadi.
"""to'liq fon tizimi: izoh qoldirish (darrov javob), fonda bildirishnoma + log + statistika; yengil ish naqshi."""
import warnings
warnings.filterwarnings("ignore")
from fastapi import BackgroundTasks, FastAPI
from fastapi.testclient import TestClient
from pydantic import BaseModel
app = FastAPI(title="Wisar Izoh API")
IZOHLAR: list[dict] = []
BILDIRISHNOMALAR: list[str] = []
JURNAL: list[str] = []
STAT = {"izoh_soni": 0}
class Izoh(BaseModel):
kurs: str
matn: str
muallif: str
def bildirishnoma_yubor(kurs: str, muallif: str) -> None:
BILDIRISHNOMALAR.append(f"{kurs} kursiga {muallif} izoh qoldirdi")
def audit_log(muallif: str) -> None:
JURNAL.append(f"izoh: {muallif}")
def statistika() -> None:
STAT["izoh_soni"] += 1
@app.post("/izohlar", status_code=201)
def izoh_qoldir(izoh: Izoh, fon: BackgroundTasks):
yozuv = {"id": len(IZOHLAR) + 1, "kurs": izoh.kurs, "matn": izoh.matn, "muallif": izoh.muallif}
IZOHLAR.append(yozuv)
# darrov javob, fonda: bildirishnoma, log, statistika
fon.add_task(bildirishnoma_yubor, izoh.kurs, izoh.muallif)
fon.add_task(audit_log, izoh.muallif)
fon.add_task(statistika)
return {"id": yozuv["id"], "holat": "izoh qo'shildi"}
def main() -> None:
client = TestClient(app)
print("=== 1. Izoh qoldirish (darrov javob) ===")
javob = client.post("/izohlar", json={"kurs": "Python", "matn": "zo'r dars", "muallif": "ali"})
print(f" status {javob.status_code} → {javob.json()}")
print("\n=== 2. Fon: bildirishnoma ===")
print(f" {BILDIRISHNOMALAR}")
print("\n=== 3. Fon: log va statistika ===")
client.post("/izohlar", json={"kurs": "Go", "matn": "yaxshi", "muallif": "vali"})
print(f" jurnal: {JURNAL}")
print(f" izoh soni: {STAT['izoh_soni']}")
print("\n=== 4. Qachon navbat kerak ===")
print(" yengil (bildirishnoma, log) → BackgroundTasks ✅")
print(" og'ir/ishonchli (to'lov, video) → navbat (Celery/RQ)")
print(" ⭐ BackgroundTasks — yengil ishlar; javob tez, ish fonda")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Izoh qoldirish (darrov javob) ===
status 201 → {'id': 1, 'holat': "izoh qo'shildi"}
=== 2. Fon: bildirishnoma ===
['Python kursiga ali izoh qoldirdi']
=== 3. Fon: log va statistika ===
jurnal: ['izoh: ali', 'izoh: vali']
izoh soni: 2
=== 4. Qachon navbat kerak ===
yengil (bildirishnoma, log) → BackgroundTasks ✅
og'ir/ishonchli (to'lov, video) → navbat (Celery/RQ)
⭐ BackgroundTasks — yengil ishlar; javob tez, ish fondaNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Og'ir ish endpointda" | Fonda (javob tez) |
| "Fon vazifasi javobdan oldin" | Javobdan keyin |
"add_task funksiyani chaqiradi" |
Chaqirmaydi (keyin) |
"BackgroundTasks ishonchli" |
Yengil ish uchun (server o'chsa yo'q) |
"Og'ir ish ham BackgroundTasks" |
Navbat (Celery) kerak |
| "Fon xatosi javobni buzadi" | Javob allaqachon ketgan |
| "Fon vazifasi kuzatiladi" | Yo'q (navbatda bor) |
| "Fon vazifasi har doim tez" | Yengil bo'lsin (bloklamasin) |
6. Keng tarqalgan xatolar va yechimlari
1. Og'ir ishni endpointda kutish
def royxat(ism: str):
email_yubor(ism) # ⚠️ foydalanuvchi kutadi
return {"ok": True}
# ✅ fon.add_task(email_yubor, ism)2. add_taskda funksiyani chaqirish
fon.add_task(email_yubor(ism)) # ❌ darrov chaqirdi
fon.add_task(email_yubor, ism) # ✅ funksiya + arg3. Og'ir ish uchun BackgroundTasks
fon.add_task(video_qayta_ishla) # ⚠️ og'ir, ishonchsiz
# ✅ navbat (Celery/RQ) — kuzatuv, qayta urinish4. Fon xatosini log qilmaslik
def fon_ish(): riskli_amal() # ⚠️ xato bilinmaydi
def fon_ish():
try: riskli_amal()
except Exception: log(...) # ✅5. BackgroundTasks parametrini unutish
def ep(): fon.add_task(...) # ❌ fon yo'q
def ep(fon: BackgroundTasks): ... # ✅6. Fon vazifasiga natija kutish
natija = fon.add_task(hisobla) # ❌ natija bermaydi
# ✅ natija kerak bo'lsa — navbat (holat/natija bilan)7. Fon vazifasida umumiy o'zgaruvchini xavfsizsiz o'zgartirish
# ko'p ishchi holatda fon global holatni buzishi mumkin
# ✅ atomik amal yoki navbat ishlating7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 14-qism (o'tilgan): asinxron —
asyncfon vazifalari - 20.10-dars (o'tilgan): ro'yxatdan o'tish — tasdiq email (fon)
- 20.13-dars (o'tilgan): fayl — katta faylni fonda qayta ishlash
- 28-qism: infratuzilma — navbat tizimlari (Celery, RQ)
- 29-qism: miqyoslash — fon ishlarini ajratish
8. Eng yaxshi amaliyotlar
Javob uchun kerak bo'lmagan ishni fonda bajaring.
add_task(funksiya, arg)— funksiyani chaqirmang.Yengil ishlar (email, log) —
BackgroundTasks.Og'ir/ishonchli ishlar — navbat (Celery, RQ).
Fon vazifasida xatoni log qiling (bilinmay qolmasin).
Fon vazifasi yengil bo'lsin (uzoq ishlamaslin).
Natija/kuzatuv kerak bo'lsa — navbat tizimi.
Umumiy holatni fonda xavfsiz o'zgartiring (atomik/navbat).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # BackgroundTasks nima?
2. # fon vazifasi qachon ishlaydi?
3. # add_task funksiyani chaqiradimi?
4. # og'ir ish qayerda?
5. # BackgroundTasks ishonchlimi?
6. # fon xatosi javobni buzadimi?
7. # navbat qachon kerak?
8. # bir necha add_task tartibi?
9. # fon vazifasi kuzatiladimi?
10. # email fonda nima uchun?
11. # add_task(f, x) — x nima?
12. # server o'chsa fon vazifasi?Javoblar
- Javobdan keyin bajariladigan ishlar
- Javob yuborilgandan keyin
- Yo'q (keyin chaqiradi)
- Fonda (yoki navbatda) — javob tez
- Yo'q (yengil ish uchun; server o'chsa yo'qoladi)
- Yo'q (javob allaqachon ketgan)
- Og'ir/ishonchli/kuzatiladigan ishlar uchun
- Qo'shilgan tartibda
- Yo'q (navbatda bor)
- Sekin — foydalanuvchi kutmasligi uchun
- Funksiya argumenti (keyin chaqiriladi)
- Yo'qoladi (jarayonda edi)
Vazifa 2: Xatolarni tuzating
1. def royxat(ism):
email_yubor(ism) # kutadi
return {...}
2. fon.add_task(email_yubor(ism)) # chaqirdi
3. fon.add_task(video_qayta_ishla) # og'ir
4. def fon_ish(): riskli_amal() # xato log
5. def ep(): fon.add_task(...) # parametrJavoblar
1. def royxat(ism: str, fon: BackgroundTasks):
fon.add_task(email_yubor, ism)
2. fon.add_task(email_yubor, ism)
3. # navbat (Celery/RQ) — og'ir ish
4. def fon_ish():
try: riskli_amal()
except Exception: log(...)
5. def ep(fon: BackgroundTasks): ...Vazifa 3: Email tasdiqlash
Ro'yxatdan o'tish + email:
POST /royxat— foydalanuvchi saqlanadi- Fonda tasdiq email (soxta funksiya)
- Darrov javob (email kutmasdan)
TestClientbilan test (email fonda bajarilganini)
Vazifa 4: Audit log
Har so'rovni log qilish:
- Bog'liqlik bilan fon log
- So'rov URL, vaqt, foydalanuvchi
- Har endpointda avtomatik
- Log to'plamini test
Vazifa 5: Vaqtincha fayl tozalash
Fayl yuklab, fonda tozalash:
- Fayl qabul qili 20.13-bob va qayta ishla
- Fonda vaqtincha faylni o'chir
- Javob darrov
- Tozalash bajarilganini test
Vazifa 6: Fon vs navbat qaror
Turli ishlar uchun qaror:
- Email, log, kesh (yengil) →
BackgroundTasks - To'lov, video, hisobot (og'ir) → navbat
- Har biri uchun sabab yozing
- Chegara holatlarini muhokama qiling
Vazifa 7: O'ylash
Fon vazifasi "sinxron" (foydalanuvchi kutadi) va "asinxron" (foydalanuvchi kutmaydi) ishni ajratadi: javob uchun kerak narsa (izoh saqlandi) darrov, kerak bo'lmagan narsa (bildirishnoma) keyin. Bu "muhim yo'l" (critical path) ni qisqartirish — javob tezligini oshirish usuli. Qaysi ish "muhim yo'lda" (javob uchun kerak) va qaysisi emas — buni qanday aniqlaysiz, va bu ajratish tizim tezligi va ishonchliligiga qanday ta'sir qiladi?
Javob
Qisqa javob: "Muhim yo'l" (critical path) — javob berish uchun majburiy bajarilishi kerak ishlar (izohni saqlash, javobni shakllash). "Muhim yo'lda emas" — javob berilgandan keyin bajarilsa ham bo'ladigan ishlar (bildirishnoma, log, statistika). Ajratish usuli: "Bu ish natijasi javobda kerakmi?" — ha bo'lsa muhim yo'lda (darrov), yo'q bo'lsa fonda. Bu javob tezligini oshiradi (foydalanuvchi faqat muhim ishni kutadi) va ishonchlilikni yaxshilaydi (fon ishi nosoz bo'lsa, javob buzilmaydi).
1. Muhim yo'l (critical path)
| Muhim yo'lda (darrov) | Muhim yo'lda emas (fon) |
|---|---|
| Izohni saqlash | Bildirishnoma |
| Javobni shakllash | Log/audit |
| Validatsiya | Statistika |
| Ma'lumot o'qish | Kesh yangilash |
2. Ajratish savoli
"Bu ish natijasi javobda kerakmi, yoki foydalanuvchi darhol natijani ko'rishi kerakmi?"
- Ha → muhim yo'l (darrov)
- Yo'q → fon (keyin)
3. Tezlikka ta'siri
Muhim yo'l qancha qisqa bo'lsa, javob shuncha tez. Og'ir ishni (email 2s) muhim yo'ldan olib tashlash — javob 2s tezroq.
Muhim yo'l: so'rov → saqlash → javob (tez)
Fon: → email → log → statistika (keyin)4. Ishonchlilikka ta'siri
Fon ishi (email) nosoz bo'lsa — javob buzilmaydi (allaqachon ketgan). Muhim yo'lda faqat zarur ishlar bo'lsa, kamroq nosozlik nuqtasi.
5. Muhandislik saboqlari
- Muhim yo'lni aniqla (javob uchun zarur)
- Zarur bo'lmagan ishni fonda bajar
- Muhim yo'l qisqa → javob tez
- Fon nosozligi javobni buzmaydi
6. Xulosa
- Muhim yo'l — javob uchun majburiy ishlar
- "Javobda kerakmi?" — ajratish savoli
- Fon — muhim yo'lni qisqartiradi (tezlik)
- Ajratish — tezlik va ishonchlilik
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda fon vazifalarini — BackgroundTasks bilan javobdan keyingi ishlarni o'rgandik.
Eng muhim uch fikr:
BackgroundTasks— javobdan keyin ish. Endpointgafon: BackgroundTasksparametr qo'shiladi,fon.add_task(funksiya, *args)bilan vazifa qo'shiladi. Javob darrov qaytadi, fon vazifasi javob yuborilgandan keyin bajariladi.add_taskfunksiyani chaqirmaydi — uni va argumentlarini saqlaydi, keyin chaqiradi. Foydalanuvchi og'ir ishni (email, log) kutmaydi.Qachon ishlatiladi. Fon vazifasi — natijasi foydalanuvchiga darhol kerak bo'lmagan ishlar uchun: email yuborish, log/audit, kesh yangilash, vaqtincha fayl tozalash. Bir endpointda bir necha
add_task— qo'shilgan tartibda bajariladi.BackgroundTasksbog'liqlik ichida ham ishlaydi (har so'rovni log qilish). Fon vazifasida xato javobni buzmaydi (javob allaqachon ketgan) — shuning uchun xatoni serverda log qiling.Cheklovlar va navbat.
BackgroundTasks— yengil, tez ishlar uchun; u server jarayonida ishlaydi, server o'chsa vazifa yo'qoladi (ishonchsiz), holati kuzatilmaydi. Og'ir, uzoq yoki ishonchli ishlar (to'lov, video qayta ishlash) uchun — navbat tizimi (Celery, RQ, message queue) kerak: alohida ishchi, holat kuzatuvi, xatoda qayta urinish. Asosiy tamoyil — "muhim yo'l" (javob uchun zarur ish) ni qisqartirish: zarur ishni darrov, boshqasini fonda bajarish javob tezligi va ishonchliligini oshiradi.
Keyingi darsda testlash ni o'rganamiz: FastAPI ilovasini TestClient bilan sinash, endpointlarni, autentifikatsiyani, bazani test qilish va dependency_overrides bilan bog'liqliklarni almashtirish.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!