Sobes.tech
Middle

რა არის კორუტინა Kotlin-ში და როგორ მუშაობს?

sobes.tech AI

პასუხი AI-სგან

Котлинде корутина — бул жеңил аткаруу бирдиги, ал асинхрондуу жана блоктогон эмес кодду окула турган жана катарлаш жазууга мүмкүндүк берет. Ал потокко (thread) окшош, бирок кыйла жеңил жана көптөгөн түзүлүштөрдө оңой түзүлөт.

Негизги компоненттери жана иштөө принциптери:

  • Suspend Functions (Suspendable Functions): suspend ачкыч сөзү менен белгиленген функциялар өзүнүн аткарылуусун убактылуу токтотуп, (suspend), аткаруу токтогон потокту блоктогон эмес. Токтотулган функция өзүнүн "күтүү" операциясы (мисалы, тармактык суроо-талап) аяктагандан кийин, кайра токтогон жеринен ишин уланта алат.
  • Context (Coroutine context): Корутинанын жүрүм-турумун башкарган элементтердин жыйындысы. Контекстке кирет:
    • Job: Корутинанын сүрөттөмөсү, анын жашоо циклин (жокко чыгаруу, аяктоону күтүү) башкарууга мүмкүндүк берет.
    • CoroutineDispatcher: Корутинанын аткарылуучу поток(тор)ун аныктайт. Ал потокторду алмаштырууга мүмкүндүк берет.
    • CoroutineName: Дагы бир дебаг үчүн ыктыярдуу ат.
    • CoroutineExceptionHandler: Иштелбеген ката-чыгымдарды иштетүүчү.
  • Builders (Куруучулар): Корутиналарды ишке киргизүүчү функциялар:
    • launch: Жаңы корутинаны ишке киргизет, натыйжаны кайтарбайт. Job кайтарат.
    • async: Жаңы корутинаны ишке киргизет, ал натыйжаны кайтарат (Deferred). Натыйжаны алуу үчүн .await() колдонулат.
    • runBlocking: Блоктоочу куруучу, негизинен тестирлөөдө же блоктоочу код менен интеграциялоо үчүн колдонулат.

Бул иштөө принциби:

Корутина жеке потокторду түзбөйт. Анын ордуна, suspend функциясы токтотулганда, компилятор код түзөт, ал учурдагы эсептөөлөрдүн абалын сактайт. Натыйжа жеткиликтүү болгондо, корутина CoroutineDispatcher башкарган потоктордун биринде кайра улантылат. Бул suspend функцияларын асинхрондук чакырууларга жана улантууларга (continuation-passing style) айландыруу аркылуу ишке ашырылат, бул бир поток көптөгөн корутиналарды аткарууга мүмкүндүк берет, алар токтотулганда алмаштырылат.

Мисал:

import kotlinx.coroutines.*

fun main() = runBlocking { // Учурдагы потокту корутинанын аяктаганча бөгөттөйт
    println("Биринчи")

    launch { // Фон режиминде жаңы корутинаны ишке киргизүү
        delay(1000L) // Блоктогон эмес 1 секунддык кечигүү
        println("Кечигүүдөн кийин")
    }

    println("Андан кийин") // Бул сап launch корутинанын аяктаганча аткарылбайт
}

Бул коддун чыгышы:

Биринчи
Андан кийин
Кечигүүдөн кийин

Бул launch жана delay блоктогон эмес экенин көрсөтүп турат.