launch — mohiyati, fire-and-forget koroutinlarni ishga tushirish va qanday ishlashi

Muallif: IT Sectr Nashr etilgan: 2026-06-22 O'qish vaqti: 7 daq

launch — Kotlin-dagi Coroutine Builder bo'lib, natija qaytarmasdan koroutinani ishga tushiradi va bajarilishni boshqarish uchun Job obyektini qaytaradi. Ushbu builder fire-and-forget namunasini amalga oshiradi: koroutina fon oqimida ish boshlaydi va avtomatik ravishda yakunlanadi. JetBrains hujjatlariga, 2024 ko'ra, launch Kotlin Coroutines-da parallel vazifalarni ishga tushirishning asosiy usulidir.

Asosiy fikrlar

  • launch — natija qaytarmasdan koroutinalarni ishga tushirish uchun builder (fire-and-forget)
  • Job — cancel(), join(), isActive metodlari bilan koroutinani boshqarish obyekti
  • launch avtomatik bekor qilish uchun CoroutineScope bilan integratsiyalanadi
  • CoroutineStart.LAZY ishga tushirishni start() yoki join() chaqiruvigacha kechiktirishga imkon beradi
  • launch Android-da ma'lumotlar bazasiga yozish, tarmoq chaqiruvlari va UI yangilash uchun ishlatiladi

Kotlin Coroutines-da launch nima?

launch — kotlinx.coroutines import orqali mavjud bo'lgan, berilgan CoroutineScope-da yangi koroutina yaratadigan Kengaytma funksiyasidir. Oddiy funksiyalardan farqli o'laroq, launch ichidagi kod konkurrent tarzda bajariladi — koroutina oqimni bloklamasdan to'xtatilishi (suspend) va keyinroq tiklanishi mumkin.

Launch builder Kotlin koroutina modelining asosiy qurilish blokidir. U hisoblangan qiymatni qaytarmaydi, lekin koroutina bajarilishini nazorat qilish imkonini beruvchi Job obyektini qaytaradi. Boshqa koroutina ichida launch orqali ishga tushirilgan barcha bola koroutinalar ota-onaga bog'lanadi.

Launch sintaksisi va parametrlari

Launch builder bir necha parametrga ega inline funksiya sifatida aniqlanadi: CoroutineScope, CoroutineContext, CoroutineStart va suspend-blok. Parametrlar standart qiymatlarga ega, bu esa launch-ni odatiy stsenariylar uchun qulay qiladi.

kotlin
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job

context parametri dispetcher, istisno ishlovchisi va nomlangan elementni birlashtiruvchi CoroutineContext-ni qabul qiladi. Ko'pincha Dispatchers.IO, Dispatchers.Main yoki xatolarni izolyatsiya qilish uchun SupervisorJob uzatiladi.

Job va hayot sikli boshqaruvi

Job — koroutinaning hayot siklini ifodalovchi qaytariladigan obyekt. Job quyidagi holatlarda bo'lishi mumkin: New, Active, Completing, Completed, Cancelling, Cancelled. Har bir holat bajarilish holatini aks ettiradi va o'zgarishlarga reaksiya berishga imkon beradi.

kotlin
val job = CoroutineScope(Dispatchers.IO).launch {
    repeat(10) { i ->
        delay(1000L)
        println("Taraqqiyot: $i")
    }
}

println("Job faol: ${job.isActive}")
delay(2500L)
job.cancel()
println("Job bekor qilingan: ${job.isCancelled}")

Job iyerarxiyani qo'llab-quvvatlaydi: agar ota-ona koroutina bekor qilinsa, barcha bolalar avtomatik ravishda bekor qilinadi. SupervisorJob bu xatti-harakatni o'zgartiradi — bola koroutinalar ulardan birining xatosi bilan bekor qilinmaydi.

Launch-da strukturalashtirilgan konkurrentlik

Strukturalashtirilgan konkurrentlik har bir koroutina ma'lum bir CoroutineScope-da ishga tushirilishini anglatadi va scope barcha bola koroutinalar ishini tugatmaguncha yakunlanmaydi. launch bu tamoyilni to'liq qo'llab-quvvatlaydi — boshqa koroutina ichida ishga tushirilgan koroutinalar uning bolalaridir.

Ichma-ich launch chaqiruvlari

Ichma-ich launch ishga tushirilganda koroutinalar daraxti hosil bo'ladi. Ota-ona koroutina barcha bolalarning tugashini kutadi, bu bashorat qilinadigan bajarilish tartibini kafolatlaydi va resurs boshqaruvini soddalashtiradi.

kotlin
fun main() = runBlocking {
    launch {
        launch {
            delay(1000L)
            println("Bola 1 tugadi")
        }
        launch {
            delay(500L)
            println("Bola 2 tugadi")
        }
        println("Barcha bolalar bu satrdan oldin tugadi")
    }
}

Bu xatti-harakat oqimga asoslangan konkurrentlikdan farq qiladi, bunda bola oqimlar ota-onaga bog'liq emas. Koroutinalarda ota-ona tugamaydi, barcha bolalar ishini tugatmaguncha.

Launch-da istisnolarni qayta ishlash

Launch-da istisnolarni qayta ishlash Job turiga bog'liq. Oddiy Job uchun istisnolar ota-ona koroutinaga tarqaladi va uni bekor qiladi. SupervisorJob yoki SupervisorScope uchun istisnolar izolyatsiya qilinadi — bir bola koroutinaning xatosi boshqalarga ta'sir qilmaydi.

kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
    try {
        riskyOperation()
    } catch (e: Exception) {
        println("Tutildi: ${e.message}")
    }
}
scope.launch {
    println("Bu SupervisorJob tufayli hali ham ishlaydi")
}

Tutilmagan istisnolarni global qayta ishlash uchun CoroutineExceptionHandler ishlatiladi. U koroutina ichida qayta ishlanmagan istisnolarni tutadi va dastur ishdan chiqmasdan xatoni qayd etishga imkon beradi.

Android-da launch dan foydalanish misollari

Android-da launch hamma joyda qo'llaniladi: ViewModel-dan WorkManager-gacha. Asosiy namuna — komponent hayot sikli tugaganda koroutinalarni avtomatik bekor qilish uchun Fragment-da lifecycleScope va ViewModel-da viewModelScope dan foydalanishdir.

kotlin
class ProfileViewModel : ViewModel() {
    private val repository = UserRepository()

    fun loadProfile(userId: String) {
        viewModelScope.launch(Dispatchers.IO) {
            val profile = repository.fetchProfile(userId)
            withContext(Dispatchers.Main) {
                _profileState.update { it.copy(profile = profile) }
            }
        }
    }
}

viewModelScope ViewModel yo'q qilinganda koroutinalarni avtomatik bekor qiladi. Bu xotira oqishini bartaraf qiladi va fon operatsiyalari kontekst yo'qolgandan keyin davom etmasligini kafolatlaydi. Qo'shimcha ravishda dispetcherlar o'rtasida o'tish uchun withContext dan foydalanish mumkin.

Tez-tez beriladigan savollar

Kotlin Coroutines-da launch async-dan nimasi bilan farq qiladi?

launch Job qaytaradi va bajarilish natijasini qaytarmaydi, async esa natija olish uchun Deferred<T> qaytaradi. launch fire-and-forget operatsiyalari uchun, async — qaytarilgan qiymatni kutish va ishlatish kerak bo'lganda ishlatiladi.

Launch orqali ishga tushirilgan koroutinani qanday bekor qilish mumkin?

Saqlandigan Job obyektida job.cancel() ni chaqiring. Guruhli bekor qilish uchun scope.cancel() orqali butun CoroutineScope-ni bekor qiling. Koroutina kooperativ bo'lishi kerak — isActive ni tekshirish yoki tekshiriladigan suspend funksiyalaridan foydalanish kerak.

Agar launch istisno tashlasa nima qilish kerak?

Launch bloki ichida try-catch dan foydalaning yoki CoroutineContext-da CoroutineExceptionHandler ni uzating. Xatolarni izolyatsiya qilish uchun SupervisorJob dan foydalaning — unda bir bola koroutinadagi istisno qolganlarini bekor qilmaydi.

Launch-ni CoroutineScope-siz ishga tushirish mumkinmi?

Yo'q, launch CoroutineScope-ning kengaytma funksiyasidir. Scope-siz koroutina strukturalashtirilgan konkurrentlik tamoyiliga amal qila olmaydi. GlobalScope.launch dan ehtiyotkorlik bilan foydalaning — bu hayot sikliga bog'lanmagan koroutina yaratadi.

Bir vaqtning o'zida nechta launch koroutinasini ishga tushirish mumkin?

Soni dispetcherning oqimlar havuzi bilan cheklangan. Dispatchers.Default CPU yadrolari soniga teng miqdordagi oqimlardan foydalanadi. Dispatchers.IO 64 tagacha oqimni qo'llab-quvvatlaydi. Ko'proq koroutina ishga tushirilganda ular navbatga qo'yiladi.

Xulosa

  • launch — Job obyektini qaytaruvchi fire-and-forget koroutinalari uchun asosiy builder
  • Job boshqaruv metodlarini taqdim etadi: cancel(), join(), isActive, isCancelled, isCompleted
  • Strukturalashtirilgan konkurrentlik ota-ona bekor qilinganda bola koroutinalarning bekor qilinishini kafolatlaydi
  • Istisnolarni qayta ishlash Job turiga bog'liq: oddiy xatolarni tarqatadi, SupervisorJob izolyatsiya qiladi
  • lifecycleScope va viewModelScope — Android-da launch ishga tushirish uchun tayyor yechimlar
  • CoroutineStart.LAZY ishga tushirishni start() yoki join() chaqiruvigacha kechiktiradi
  • Android-da launch tarmoq so'rovlari, ma'lumotlar bazasiga yozish, analitika va keshlash uchun qo'llaniladi

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