Sobes.tech
Middle

Kotlin'da korutina nima va u qanday ishlaydi?

sobes.tech AI

AIdan javob

Kotlin'dagi korutina — bu yengil bajarish birligi bo'lib, asinxron va bloklamaydigan kodni yanada o'qilishi oson va ketma-ket yozishga imkon beradi. U threadga o'xshaydi, lekin juda yengil va katta miqdorda yaratish mumkin.

Asosiy komponentlar va ishlash prinsiplari:

  • Suspend funksiyalar: suspend so'z bilan belgilangan funksiyalar, ular bajarilayotgan threadni bloklamasdan to'xtatishi mumkin. To'xtatilgan funksiya, "kutish" operatsiyasini (masalan, tarmoq so'rovi) tugatgach, to'xtatilgan joydan davom etishi mumkin.
  • Kontekst (Korutina konteksti): Korutinaning xulqini boshqaradigan elementlar to'plami. Ular quyidagilarni o'z ichiga oladi:
    • Job: Korutinaning hayot aylanishini boshqaradigan tavsifchi.
    • CoroutineDispatcher: Korutina bajariladigan thread(lar)ni belgilaydi. Threadlar orasida o'tishni imkon beradi.
    • CoroutineName: Xatoliklarni aniqlash uchun ixtiyoriy nom.
    • CoroutineExceptionHandler: Boshqarilmagan istisnolar uchun handler.
  • Builderlar: Korutinalarni ishga tushiradigan funksiyalar:
    • launch: Yangi korutina boshlaydi, natija qaytarmaydi. Jobni qaytaradi.
    • async: Natija qaytaradigan (Deferred) yangi korutina boshlaydi. Natijani olish uchun .await() ishlatiladi.
    • runBlocking: Bloklovchi builder, asosan testlar yoki bloklovchi kod bilan integratsiya uchun ishlatiladi.

Qanday ishlaydi:

Korutinalar har bir vazifa uchun alohida thread yaratmaydi. O'rniga, suspend funksiyasi to'xtatilganda, kompilyator hisoblash holatini saqlovchi kodni generatsiya qiladi. Natija mavjud bo'lsa, korutina CoroutineDispatcher tomonidan boshqariladigan threadlardan birida davom ettiriladi. Bu, suspend funksiyalarini asinxron chaqiruvlarga aylantirish bilan amalga oshiriladi, bu esa bitta threadning ko'plab korutinalarni bajarishiga imkon beradi va ular to'xtatilganda o'rtasida o'tishni ta'minlaydi.

Misol:

import kotlinx.coroutines.*

fun main() = runBlocking { // Hozirgi threadni bloklaydi, runBlocking ichidagi korutina tugaguncha
    println("Birinchi")

    launch { // Orqa fonda yangi korutina ishga tushiradi
        delay(1000L) // Bloklamaydigan 1 sekundlik kechikish
        println("Kechikishdan keyin")
    }

    println("Keyin") // Bu satr launch korutinasining tugashidan oldin bajariladi
}

Bu kodning chiqishi:

Birinchi
Keyin
Kechikishdan keyin

Bu, launch va delay'ning bloklamaydigan tabiatini ko'rsatadi.