Python Asyncio: Boshlang'ichlar Uchun To'liq Qo'llanma

Muallif: Javohir Abdullayev · · Python

Python Asyncio: Boshlang'ichlar Uchun To'liq Qo'llanma

Nega Asinxron Dasturlashni O'rganish Muhim?

Zamonaviy backend loyihalar, Telegram botlar va API servislar minglab foydalanuvchilarning so'rovlariga bir vaqtning o'zida tezkor javob berishi talab etiladi. Klassik sinxron dasturlash modelida dastur har bir operatsiyani ketma-ket bajaradi: biror tarmoq so'rovi yoki fayl o'qish jarayoni tugamaguncha butun dastur navbatdagi qadamni kutib turadi. Python-dagi asyncio moduli aynan shu muammoni hal qilish, ya'ni tizim resurslaridan unumli foydalangan holda I/O-bound (kiritish-chiqarishga bog'liq) amallarni parallel ko'rinishda tezkor bajarish uchun yaratilgan.

Sinxron va Asinxron Jarayonlar: Oddiy Tushuntirish

Tasavvur qiling, siz gavjum restoranda ofitsiant bo'lib ishlaysiz. Sinxron yondashuvda siz bitta mijozdan buyurtma olasiz, uni oshxonaga topshirasiz va taom tayyor bo'lguncha oshxona oldida harakatsiz kutib turasiz. Shu vaqt ichida boshqa mijozlarga qaramaysiz. Bu juda sekin va samarasiz tizimdir.

Asinxron yondashuvda esa siz buyurtmani oshxonaga berasiz-da, taom tayyor bo'lishini kutmasdan darhol boshqa stollardagi mijozlarning buyurtmalarini qabul qilishga o'tasiz. Oshxonadan taom tayyor bo'lganligi haqida xabar kelgandagina, uni olib borib topshirasiz. Python asyncio kutubxonasi ham aynan shu tamoyil asosida ishlaydi.

Asosiy Tushunchalar: Coroutine, Event Loop va Await

Asinxron Python arxitekturasini tushunish uchun uchta asosiy tushunchani bilish lozim:

  • Event Loop (Hodisalar halqasi): Barcha asinxron vazifalarni boshqaruvchi markaziy boshqaruvchi. U qaysi vazifa ma'lumot kelishini kutayotganini va qaysi biri bajarilishga tayyorligini uzluksiz nazorat qiladi.
  • Coroutine (Korutina): Bajarilishini vaqtinchalik to'xtatib turish va keyinroq yana davom ettirish mumkin bo'lgan funksiya. Oddiy funksiyalardan farqli ravishda, ular async def kalit so'zlari orqali e'lon qilinadi.
  • await: Korutina ichida boshqa bir asinxron amaliyotning yakunlanishini kutish uchun yoziladi. U Event Loop'ga: 'Men ma'lumot kelishini kutyapman, sen boshqa ishlarni bajarib turaver', degan buyruqni beradi.

Birinchi Asinxron Dasturni Yozamiz

Keling, eng sodda amaliy misolni tahlil qilamiz. Asinxron korutinani to'g'ridan-to'g'ri oddiy funksiya kabi chaqirib bo'lmaydi. Uni hodisalar halqasida yurgizish uchun asyncio.run() funksiyasidan foydalanamiz:

import asyncio

async def salom_ber():
    print("Salom!")
    await asyncio.sleep(1)
    print("Xayr!")

asyncio.run(salom_ber())

Ushbu kodda asyncio.sleep(1) chaqirilganda, dastur butun tizimni muzlatib qo'ymaydi, balki boshqa kutayotgan vazifalarga navbat beradi.

asyncio.gather Bilan Bir Nechta Vazifani Bajarish

Asinxronlikning haqiqiy kuchi bir vaqtning o'zida bir nechta mustaqil operatsiyalar bajarilganda yaqqol ko'rinadi. Masalan, bir nechta API servisidan ma'lumot olish zarur bo'lsin:

import asyncio
import time

async def malumot_ol(id, soniya):
    print(f"Vazifa {id} boshlandi...")
    await asyncio.sleep(soniya)
    print(f"Vazifa {id} yakunlandi!")
    return f"Natija {id}"

async def asosiy():
    boshlanish = time.time()
    natijalar = await asyncio.gather(
        malumot_ol(1, 2),
        malumot_ol(2, 3),
        malumot_ol(3, 1)
    )
    print(natijalar)
    print(f"Jami ketgan vaqt: {round(time.time() - boshlanish, 2)} soniya")

asyncio.run(asosiy())

Agar ushbu jarayon sinxron tarzda bajarilganida, umumiy vaqt 2 + 3 + 1 = 6 soniya bo'lar edi. Lekin asyncio.gather barchasini bir paytda ishga tushirgani uchun dastur eng uzoq davom etgan vazifa vaqtida, ya'ni taxminan 3 soniyada to'liq yakunlanadi.

Boshlovchilar Qiladigan Eng Katta Xato

Boshlovchilar orasida eng ko'p tarqalgan xato — asinxron funksiya ichida sinxron, bloklovchi kutubxonalardan foydalanishdir. Agar siz async def ichida standart time.sleep() yoki oddiy requests.get() yozsangiz, u butun Event Loop faoliyatini to'xtatadi. Natijada boshqa barcha asinxron vazifalar navbatda qotib qoladi. Har doim asinxron muqobillardan (masalan, requests o'rniga httpx yoki aiohttp) foydalanish zarur.

Qachon Asyncio Tanlash Kerak?

Asinxron dasturlash har qanday muammoga universal yechim emas. U quyidagi holatlarda yuqori samaradorlik beradi:

  • Tavsiya etiladi: Telegram botlar (Aiogram), FastAPI veb-servislari, ma'lumotlar bazasiga ko'p sonli so'rovlar yuborish, web scraping va chat tizimlari kabi I/O-bound vazifalar.
  • Tavsiya etilmaydi: Videolarni qayta ishlash, rasm o'lchamini o'zgartirish, murakkab matematik hisob-kitoblar kabi protsessor quvvatini talab qiluvchi (CPU-bound) ishlar. Bunday vazifalar uchun Python-ning multiprocessing kutubxonasi ancha mos keladi.

Xulosa

Python-da asyncio bilan ishlashni o'rganish sizning dasturchi sifatidagi imkoniyatlaringizni sezilarli darajada kengaytiradi. Ayniqsa zamonaviy Telegram botlar yoki yuqori yuklamali veb-ilovalarni barpo etishda asinxron dasturlash tamoyillarini bilish shart. Kodingizdagi bloklovchi qismlarni aniqlang va ularni asinxron shaklga o'tkazish orqali loyihangiz tezligini oshiring.

Teglar: #Python #Asyncio #Asinxron Dasturlash #Backend