Sobes.tech
Middle

Ի՞նչ է կորուտին Kotlin-ում և ինչպես է աշխատում:

sobes.tech AI

Պատասխան AI-ից

Կորուտինն ի Kotlin — դա թեթև միավոր է, որը թույլ է տալիս գրել ասինխրոնային ոչ բլոկավոր կոդ ավելի ընթեռնելի և հաջորդական ձևով: Այն նման է հոսքին (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-ի ոչ բլոկավոր բնույթը։