Coroutine Builder: bu nima, korutin quruvchilarining turlari va ular qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-06-21 O'qish vaqti: 8 daq

Coroutine Builder — Kotlin Coroutines funksiyalari bo'lib, ular korutinlarni yaratadi va ishga tushiradi, ularning bajarilish usulini belgilaydi. launch, async, runBlocking va produce quruvchilari turli stsenariylarni qamrab oladi: fon vazifalaridan tortib natija qaytaradigan parallel hisoblashlargacha. JetBrains, 2024 ma'lumotlariga ko'ra, Coroutine Builder korutin modelining asosidir va tuzilgan konkurrentlik va hayot siklini boshqarishni ta'minlaydi.

Asosiy fikrlar

  • Coroutine Builder — ma'lum CoroutineScope-da korutin yaratuvchi funksiya
  • launch — natija qaytarmasdan korutinni ishga tushiradi, Job obyektini qaytaradi
  • async — Deferred qaytaruvchi korutinni ishga tushiradi, await() orqali natija olish imkonini beradi
  • runBlocking — joriy oqimni bloklaydi, blocking va suspending kod o'rtasida ko'prik sifatida ishlatiladi
  • produce — ma'lumotlarni oqimli uzatish uchun kanalli korutin yaratadi (Flow foydasiga eskirgan)

Coroutine Builder nima?

Coroutine Builder — CoroutineScope va suspend-blokni qabul qiluvchi, yangi korutin yaratib ishga tushiruvchi Kotlin kengaytma funksiyasidir. Har bir quruvchi korutinning qanday bajarilishini belgilaydi: natija bilan yoki natijasiz, oqimni bloklash bilan yoki asinxron tarzda. Quruvchilar tildagi korutin modeliga kirish nuqtalaridir.

Barcha quruvchilar bola korutinlarning hayot siklini boshqaruvchi CoroutineScope orqali ishlaydi. Scope bekor qilinganda u orqali ishga tushirilgan barcha korutinlar avtomatik bekor qilinadi — bu tuzilgan konkurrentlik tamoyilidir. Bu yondashuv korutin sizib ketishining oldini oladi va bashorat qilinadigan yakunlanishni kafolatlaydi.

kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Quruvchilar CoroutineScope ichida ishlaydi
    val job = launch {
        delay(1000L)
        println("Dunyo!")
    }
    println("Salom,")
    job.join()
}

Korutin quruvchilarining asosiy turlari

Kotlin to'rtta o'rnatilgan korutin quruvchisini taqdim etadi: launch, async, runBlocking va produce. Ularning har biri o'z qaytariladigan turiga va qo'llanish sohasiga ega. Android mobil ishlanmasi uchun asosiylari launch va async — ular bloklamaydigan tarzda ishlaydi va arxitektura komponentlari bilan integratsiyalanadi.

QuruvchiQaytariladigan turOqim bloklanishiStsenariy
launchJobYo'qFire-and-forget vazifalar
asyncDeferred<T>Yo'qParallel hisoblashlar
runBlockingTHaTestlar, main funksiyasi
produceReceiveChannel<E>Yo'qOqimli uzatish (deprecated)

Har bir quruvchi qo'shimcha parametrlarni qabul qiladi: CoroutineStart (ishga tushirish strategiyasi), CoroutineContext (dispetcher, istisnolar) va nomlangan kod bloki. Odatiy bo'lib korutin darhol ishga tushiriladi (CoroutineStart.DEFAULT).

launch: fire-and-forget ishga tushirish

launch — Android ishlanmasida eng ko'p ishlatiladigan quruvchi. Natija qaytarmaydigan korutinni ishga tushiradi va uning hayot siklini boshqarish uchun Job obyektini qaytaradi. Bu faqat yon ta'sir kerak bo'lgan operatsiyalar uchun ideal tanlovdir: ma'lumotlar bazasiga yozish, analitika yuborish, UI yangilash.

launch sintaksisi va ishlatilishi

launch quruvchisi CoroutineScope, ixtiyoriy CoroutineContext va suspend-blokni qabul qiladi. Qaytariladigan Job korutinni bekor qilish, uning tugashini kutish yoki statusni tekshirish imkonini beradi.

kotlin
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
val job: Job = scope.launch(CoroutineStart.LAZY) {
    val data = fetchFromNetwork()
    saveToDatabase(data)
}
job.start()
job.join()

CoroutineStart.LAZY parametri ishga tushirishni start() yoki join() aniq chaqirilgunga qadar kechiktiradi. Bu kechiktirilgan inisializatsiya va shartli ishga tushirish uchun foydalidir. Standart darhol ishga tushirish uchun CoroutineStart.DEFAULT ishlatiladi yoki parametr qoldiriladi.

async: natija bilan parallel hisoblashlar

async — Deferred<T> qaytaruvchi quruvchi — natijaning asinxron va'dasi. await() chaqiruvi oqimni bloklamagan holda natija olinmaguncha korutinni to'xtatib turadi. Bu Kotlin korutinlarida parallel vazifalar uchun asosiy mexanizmdir.

Ikki so'rovni parallel ishga tushirish

async bir vaqtning o'zida bir nechta mustaqil operatsiyalarni bajarish kerak bo'lganda ayniqsa samaralidir. Suspend-funksiyalarning ketma-ket chaqirilishidan farqli o'laroq, async korutinlarni parallel ishga tushiradi va umumiy bajarilish vaqtini qisqartiradi.

kotlin
suspend fun fetchUserData(): UserData {
    val deferred1 = CoroutineScope(Dispatchers.IO).async { api.getProfile() }
    val deferred2 = CoroutineScope(Dispatchers.IO).async { api.getSettings() }
    val deferred3 = CoroutineScope(Dispatchers.IO).async { api.getNotifications() }
    return UserData(
        profile = deferred1.await(),
        settings = deferred2.await(),
        notifications = deferred3.await()
    )
}

Deferred Job-dan meros oladi, shuning uchun async hayot siklining barcha operatsiyalarini qo'llab-quvvatlaydi: bekor qilish, tugashini kutish, istisnolarni boshqarish. Scope bekor qilinganda Deferred bola korutinlari avtomatik bekor qilinadi.

runBlocking: blocking dunyosiga ko'prik

runBlocking — korutin tugaguncha joriy oqimni bloklaydigan yagona quruvchi. Yangi CoroutineScope yaratadi va berilgan korutinni ishga tushiradi, chaqiruvchi oqimni bloklaydi. main() kirish nuqtalarida, testlarda va blocking kod bilan integratsiyada ishlatiladi.

runBlocking qachon zarur

runBlocking uch stsenariyda asoslanadi: dasturning kirish nuqtasi (main), suspend-funksiyalarning birlik testlari va suspend ishlatib bo'lmaydigan callback-based kutubxonalar bilan integratsiya. Android ishlab chiqarish kodida asosiy oqimda runBlocking ishlatish qat'iyan tavsiya etilmaydi.

kotlin
class CoroutineTest {
    @Test
    fun `test suspend function`() = runBlocking {
        val result = mySuspendFunction()
        assertEquals("expected", result)
    }
}

Testlar uchun runBlocking o'rniga kotlinx-coroutines-test bilan TestCoroutineDispatcher ishlatish tavsiya qilinadi — bu vaqtni nazorat qilishni ta'minlaydi va test muhitida blokirovkalarning oldini oladi.

Mos quruvchini qanday tanlash

Coroutine Builder tanlovi qaytariladigan natija va bajarilish stsenariysiga bog'liq. Agar operatsiya ma'lumot qaytarishni talab qilmasa — launch dan foydalaning. Agar asinxron operatsiya natijasi kerak bo'lsa — async. runBlocking ni faqat bridging uchun qo'llang, produce ni esa reaktiv oqimlar uchun Flow bilan almashtiring.

Android uchun amaliy tavsiyalar

Kotlin Coroutines ishlatadigan Android loyihalarida asosiy quruvchi juftligi launch va async dir. launch ViewModel va UseCases da korutinlarni ishga tushirish uchun, async esa tarmoq yoki ma'lumotlar bazasiga parallel so'rovlar uchun ishlatiladi. Zamonaviy kutubxonalar (Ktor, Room) allaqachon suspend-funksiyalarni qo'llab-quvvatlaydi, bu esa async ni to'g'ridan-to'g'ri ishlatishga ehtiyojni kamaytiradi.

  • launch — fire-and-forget uchun (loglash, analitika, keshlashtirish)
  • async — natijalarni birlashtirish bilan parallel so'rovlar uchun
  • runBlocking — faqat main() va testlarda (production-da Main-threadda emas)
  • produce — Flow / SharedFlow / StateFlow bilan almashtiring

Ko'p beriladigan savollar

Kotlin-da launch async-dan qanday farq qiladi?

launch Job qaytaradi va bajarilish natijasini qaytarmaydi, async esa Deferred<T> — natijani await() orqali olish mumkin bo'lgan obyektni qaytaradi. launch fire-and-forget operatsiyalari uchun, async — ma'lumot qaytaruvchi vazifalar uchun ishlatiladi.

Android Activity-da runBlocking ishlatish mumkinmi?

Tavsiya etilmaydi. runBlocking asosiy oqimda ANRga sabab bo'ladi va UI ni bloklaydi. Activity va Fragment ichida lifecycleScope.launch dan foydalaning — bu blokirovkalarsiz o'rnatilgan yechimdir.

launch quruvchisi nimani qaytaradi?

launch quruvchisi korutinning hayot siklini boshqarish imkonini beruvchi Job obyektini qaytaradi: bekor qilish (cancel), tugashini kutish (join), statusni tekshirish (isActive, isCompleted, isCancelled).

Kotlin Coroutines da Deferred nima?

Deferred<T> — async quruvchisi tomonidan qaytariladigan natijaning asinxron va'dasi. Job dan meros oladi va natija olish uchun await(), bloklamaydigan kirish uchun getCompleted() va istisnoni tekshirish uchun getCompletionExceptionOrNull() metodlarini qo'shadi.

launch ni kechikish bilan qanday ishga tushirish mumkin?

CoroutineStart.LAZY parametridan foydalaning: scope.launch(start = CoroutineStart.LAZY) { ... }. Keyin haqiqiy ishga tushirish uchun job.start() yoki job.join() chaqiring. Bu kechiktirilgan inisializatsiya va korutinlarning shartli bajarilishi uchun foydalidir.

Xulosa

  • Coroutine Builder — bajarilish usuli va qaytariladigan turni belgilaydigan korutin yaratish funksiyasi
  • launch — natija qaytarmaydigan vazifalar uchun asosiy quruvchi, korutinni boshqarish uchun Job qaytaradi
  • async — parallel hisoblashlar uchun quruvchi, natijani await() imkoniyati bilan Deferred qaytaradi
  • runBlocking — main() va testlar uchun bloklovchi quruvchi, Android asosiy oqimida tavsiya etilmaydi
  • Tuzilgan konkurrentlik scope bekor qilinganda bola korutinlarning avtomatik bekor qilinishini kafolatlaydi
  • produce eskirgan — reaktiv ma'lumot oqimlari uchun Flow, SharedFlow yoki StateFlow ishlating
  • Quruvchi tanlovi stsenariyga bog'liq: fire-and-forget → launch, parallel ma'lumotlar → async, bridging → runBlocking

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing