suspend function: bu nima, sintaksis va korutinlarda ishlashi

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

Suspend function — bu suspend modifikatoriga ega bo'lgan, oqimni bloklamasdan bajarilishini to'xtatib, keyinroq xuddi shu korutinda davom ettirishi mumkin bo'lgan funksiyadir. JetBrains Kotlin Docs, 2025 ma'lumotlariga ko'ra, suspend funksiyalari korutinlarning asosiy qurilish blokidir, callback-larsiz asinxronlikni ta'minlaydi. Har bir suspend funksiyasi Continuation asosidagi state-mashinasiga kompilyatsiya qilinadi, bu to'xtash nuqtalarini samarali boshqarish imkonini beradi.

Asosiy fikrlar

  • Suspend — Kotlin kalit so'zi, funksiyani to'xtatiladigan (asinxron) deb belgilaydi
  • Continuation — kompilyator har bir suspend funksiyasiga holatni saqlash uchun qo'shadigan yashirin parametr
  • To'xtash nuqtalari — boshqa suspend funksiyalari chaqiriladigan, korutina bloklamasdan to'xtashi mumkin bo'lgan joylar
  • State-mashinasi — suspend funksiyasining ichki ko'rinishi, har bir to'xtash nuqtasi alohida state
  • Faqat korutindan chaqirish — suspend funksiyalari faqat boshqa suspend funksiyasidan yoki launch/async dan chaqirilishi mumkin

Kotlin da suspend function nima?

Suspend function — bu suspend kalit so'zi bilan e'lon qilingan, oqimni bloklamasdan bir yoki bir nechta nuqtada bajarilishini to'xtata oladigan funksiyadir. Boshqa suspend funksiyasi ichidagi har bir suspend funksiyasi chaqiruvi potentsial to'xtash nuqtasidir.

kotlin
suspend fun fetchUserData(): User {
    val response = httpClient.get("/user")
    return parser.parse(response)
}

Kotlin kompilyatori bunday funksiyani state-mashinasiga o'zgartiradi. Har bir to'xtash nuqtasi (boshqa suspend funksiyasining chaqiruvi) state (label) ga aylanadi. Joriy oqim state-lar orasida bo'shatiladi va kutilayotgan operatsiya tugagandan so'ng, bajarilish keyingi state dan davom etadi.

Paydo bo'lish tarixi

Suspend funksiyalari Kotlin 1.3 da (2018 yil) korutinlar bilan birga eksperimental xususiyat sifatida paydo bo'ldi va Kotlin 1.5 da (2021 yil) barqarorlashdi. Bungacha Kotlin/Java da asinxronlik callback-lar, RxJava va CompletableFuture orqali ta'minlanardi. Suspend funksiyalari chiziqli sintaksis va avtomatik oqim boshqaruvi bilan muqobil taklif qildi.

Suspend funksiyalari qanday ishlaydi: Continuation va state-mashinasi

Suspend funksiyalarining ichki tuzilishini tushunish korutinlar bilan to'g'ri ishlashning kalitidir. Oddiy funksiyalardan farqli o'laroq, har bir suspend funksiyasi Continuation interfeysiga ega sinfga kompilyatsiya qilinadi.

Continuation — yashirin parametr

Kotlin kompilyatori suspend funksiyasining har bir parametri oxiriga Continuation turidagi parametr qo'shadi. Continuation quyidagilarni o'z ichiga oladi:

  • context — CoroutineContext (dispetcher, job, kontekst elementlari)
  • resumeWith — natija yoki istisno bilan bajarilishni tiklash metodi
  • label — state-mashinasidagi joriy state indeksi

Misol bilan state-mashinasi

Faraz qilaylik, boshqa suspend funksiyalariga ikkita chaqiruvga ega suspend funksiyamiz bor:

kotlin
suspend fun process() {
    val a = stepOne()
    val b = stepTwo(a)
    println(b)
}

Kompilyator uni belgilar bilan state-mashinasiga o'zgartiradi:

kotlin
// Yaratilgan kodning soddalashtirilgan ko'rinishi
fun process(cont: Continuation<Unit>): Any? {
    val cont = cont as ProcessContinuation
    when (cont.label) {
        0 -> {
            cont.label = 1
            if (stepOne(cont) == COROUTINE_SUSPENDED) return COROUTINE_SUSPENDED
        }
        1 -> {
            cont.label = 2
            val a = cont.result as TypeA
            if (stepTwo(a, cont) == COROUTINE_SUSPENDED) return COROUTINE_SUSPENDED
        }
        2 -> {
            println(cont.result)
            Unit
        }
    }
}

Asosiy kuzatish: agar funksiya COROUTINE_SUSPENDED qaytarsa, joriy oqim bo'shatiladi. Asinxron operatsiya tugagach, Continuation.resumeWith chaqiriladi va state-mashinasi keyingi label dan davom etadi.

Suspend funksiyalarining sintaksisi: e'lon va chaqirish

Suspend funksiyasining e'loni oddiy funksiyadan farq qilmaydi, faqat fun dan oldin suspend kalit so'zi qo'shiladi. Faqat bitta cheklov bor: suspend funksiyasini faqat korutindan yoki boshqa suspend funksiyasidan chaqirish mumkin.

Asosiy e'lon

kotlin
suspend fun delayAndReturn(ms: Long): String {
    delay(ms)
    return "Done after ${ms}ms"
}

Ushbu misolda delay ham suspend funksiyasidir, u korutinani oqimni bloklamadan belgilangan millisekundga to'xtatadi. Kechikishdan so'ng bajarilish tiklanadi.

Korutindan chaqirish

kotlin
fun main() = runBlocking {
    val result = delayAndReturn(1000)
    println(result)
}

runBlocking oddiy dunyo bilan korutinlar o'rtasida ko'prik yaratadi. Lambda ichida istalgan suspend funksiyasini chaqirish mumkin.

Suspend lambdalari va funksional turlar

Kotlin funksional turlarning suspend versiyalarini qo'llab-quvvatlaydi — suspend () -> T va suspend (A) -> B. Bu asinxron lambdalarni yuqori darajali funksiyalarga uzatish imkonini beradi:

kotlin
suspend fun  withRetry(
    retries: Int = 3,
    block: suspend () -> T
): T {
    repeat(retries - 1) {
        try { return block() }
        catch (_: Exception) { delay(100) }
    }
    return block()
}

withRetry funksiyasi suspend lambda qabul qiladi va xatolarda uni qayta bajaradi. Bu qayta urinishlar bilan tarmoq so'rovlari uchun odatiy naqshdir.

Suspend funksiyalari oddiylardan qanday farq qiladi

Suspend va oddiy funksiyalar o'rtasidagi farqlar oddiy modifikator qo'shishdan tashqariga chiqadi. Keling, asosiy farqlarni ko'rib chiqaylik.

XususiyatOddiy funksiyaSuspend funksiyasi
Bajarilish oqimiOqimni tugaguncha bloklaydiOqimni bo'shatib, keyin davom ettirishi mumkin
Kompilyator parametrlariFaqat ko'rsatilgan parametrlarOxirida yashirin Continuation
Oddiy funksiyadan chaqirishHaYo'q
StackOqimning fizik stackiHeap da state-mashinasi + nuqtalar orasida fizik stack
QaytarishTo'g'ridan-to'g'ri qiymatQiymat yoki COROUTINE_SUSPENDED
Ish unumdorligiMinimal qo'shimcha yuk~state-mashinasi uchun bir necha nanosekund (Kotlin 1.9+)

Nega suspend funksiyalarini oddiylardan chaqirib bo'lmaydi

Oddiy funksiyada Continuation yo'q — holatni saqlash va bajarilishni tiklash uchun joyi yo'q. Agar oddiy funksiyadan suspend funksiyasini chaqirish kerak bo'lsa, runBlocking (testlar uchun) yoki CoroutineScope.launch (ishlab chiqarish uchun lifecycle ni hisobga olgan holda) dan foydalaning.

Android da suspend funksiyalari misollari

Kotlin da Android ilovalarida suspend funksiyalaridan foydalanishning uchta real stsenariysini ko'rib chiqaylik.

Misol 1: Room DAO suspend so'rovlari bilan

Room suspend funksiyalarini bevosita qo'llab-quvvatlaydi — so'rov avtomatik ravishda fon oqimida bajariladi:

kotlin
@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getUser(id: Int): User?

    @Insert
    suspend fun insertUser(user: User)
}

Room ichki ravishda so'rovni bajarish uchun Dispatchers.IO dan foydalanadi va natija suspend funksiyasi chaqirilgan dispetcherga qaytariladi.

Misol 2: Ekran yuklash uchun suspend funksiyalari kompozitsiyasi

kotlin
class ProfileViewModel : ViewModel() {
    private val repo = ProfileRepository()

    fun loadProfile(id: String) {
        viewModelScope.launch {
            val profile = repo.getProfile(id)
            _profile.value = profile
        }
    }
}

ViewModelScope.launch korutin yaratadi, uning ichida getProfile suspend funksiyasi chaqiriladi. Natija olingandan so'ng UI asosiy oqimda yangilanadi.

Misol 3: Ketma-ket asinxron qadamlar

kotlin
suspend fun placeOrder(cart: Cart): OrderResult {
    val validated = validateCart(cart)
    val payment = processPayment(validated)
    val receipt = sendReceipt(payment)
    return receipt
}

Uchta suspend funksiyasi ketma-ket bajariladi. Har bir qadamda korutina oqimni bloklamasdan to'xtashi mumkin. Agar biror qadam istisno tashlasa — qolganlari bajarilmaydi, bu buyurtmaning noto'g'ri holatlaridan himoya qiladi.

Suspend funksiyalari bilan ishlashda odatiy xatolar

Hatto tajribali Kotlin dasturchilari ham suspend funksiyalarini loyihalashda xato qiladilar. Eng keng tarqalganlarini ko'rib chiqaylik.

Xato 1: Suspend ichida bloklovchi chaqiruvlar

Suspend funksiyasi kodni avtomatik ravishda asinxron qilmaydi. Thread.sleep(), InputStream.read() va boshqa bloklovchi chaqiruvlar baribir oqimni bloklaydi. Bloklovchi operatsiyalarni o'rash uchun withContext(Dispatchers.IO) dan foydalaning.

Xato 2: Keraksiz suspend funksiyalari yaratish

Agar funksiya boshqa suspend funksiyalarini chaqirmasa va asinxron operatsiyalarni bajarmasa — suspend modifikatori ortiqcha. State-mashinasiga qo'shimcha yuk qo'shadi va chaqiruv kontekstini cheklaydi. Funksiyani faqat haqiqatan to'xtaganda suspend qiling.

Xato 3: CancellationException ni e'tiborsiz qoldirish

Korutin bekor qilinganda, suspend funksiyalari CancellationException tashlaydi. Uni o'ylamasdan tutmang — chaqiruvchi kodni bekor qilishni to'g'ri yakunlash imkoniyatidan mahrum qilasiz. Agar yakunlovchi operatsiyani bajarish kerak bo'lsa, finally bloki va NonCancellable dan foydalaning.

kotlin
suspend fun safeOperation() {
    try {
        doWork()
    } finally {
        withContext(NonCancellable) {
            cleanup()
        }
    }
}

finally bloki har doim bajariladi, bekor qilishni ham o'z ichiga oladi, NonCancellable esa tozalashning uzilmasligini kafolatlaydi.

Xato 4: Suspend funksiyalarini callback lardan chaqirish

Korutin yaratmasdan callback dan to'g'ridan-to'g'ri suspend funksiyasini chaqirib bo'lmaydi. Callback uslubini korutinlarga moslashtirish uchun suspendCoroutine yoki suspendCancellableCoroutine dan foydalaning.

Tez-tez so'raladigan savollar

Suspend funksiyasi to'xtash nuqtalariga ega bo'lmasligi mumkinmi?

Ha, texnik jihatdan suspend funksiyasi boshqa suspend funksiyalarini chaqirmasligi mumkin. Kompilyator bitta state-li (label 0) state-mashinasini yaratadi. Biroq, bunday funksiyaning amaliy foydasi yo'q — u oddiy funksiya kabi bajariladi, lekin qo'shimcha yuk bilan. Keraksiz suspend dan foydalanmang.

Suspend funksiyalarini qanday tuzatish (debug) mumkin?

Kotlin kotlinx-coroutines-debug kutubxonasini taqdim etadi — DebugProbes va korutin kuzatish vositalari bilan. Arctic Fox versiyasidan boshlab Android Studio da Debugger da Coroutines yorlig'i mavjud bo'lib, u aktiv korutinlar, ularning holati va to'xtash nuqtalarini ko'rsatadi.

Suspend nuqtalari soni ish unumdorligiga ta'sir qiladimi?

Har bir to'xtash nuqtasi state-mashinasida yangi state yaratadi. Aksariyat ilovalar uchun bitta nuqtaning qo'shimcha yuki nanosekundlarni tashkil qiladi (Kotlin 1.9+). Faqat sikl ichida o'n minglab nuqtalar bo'lganda operatsiyalarni birlashtirish yoki sequence/flow dan foydalanish tavsiya etiladi.

Suspend funksiyasi boshqa tillardagi async/await dan qanday farq qiladi?

Kotlin da suspend funksiya turining modifikatoridir, qaytariladigan qiymatning belgisi emas (C# da async kabi). Istalgan suspend funksiyasi istalgan parametr va qaytarish turiga ega bo'lishi mumkin va uning chaqiruvi sintaktik jihatdan oddiy funksiya chaqiruvidan farq qilmaydi — chaqiruv joyida await operatori mavjud emas.

Callback funksiyasini suspend ga qanday aylantirish mumkin?

Moslashtirish uchun suspendCancellableCoroutine dan foydalaning. Ichkarida continuation.resume() ni chaqiradigan callback ro'yxatdan o'tkazishni uzatasiz va agar callback obunani bekor qilishni qo'llab-quvvatlasa, bekor qilish tokenini qaytarasiz. Bu eski Android API larini o'rash uchun standart naqshdir.

Xulosa

  • Suspend function — Continuation mexanizmi orqali oqimni bloklamasdan bajarilishini to'xtata oladigan suspend modifikatorli funksiya
  • State-mashinasi — Kotlin bayt kodida suspend funksiyasining ichki ko'rinishi, har bir to'xtash nuqtasi label bilan alohida state
  • Continuation — korutin kontekstini va bajarilishni tiklash uchun resumeWith metodini o'z ichiga olgan yashirin parametr
  • Faqat korutindan chaqirish — suspend funksiyalari runBlocking yoki CoroutineScope siz oddiy funksiyalardan foydalanib bo'lmaydi
  • Bloklovchi operatsiyalar suspend ichida withContext(Dispatchers.IO) talab qiladi — aks holda oqim bloklanadi
  • Room va Retrofit suspend funksiyalarini native qo'llab-quvvatlaydi, fon oqimlarini avtomatik boshqaradi
  • CancellationException — bekor qilishni finally + NonCancellable orqali boshqaring, CancellationException ni o'ylamasdan tutmang

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