Sobes.tech
Middle

Kas yra coroutine Kotlin ir kaip ji veikia?

sobes.tech AI

Atsakymas iš AI

Kotlin korutina yra lengva vykdymo vienetas, leidžiantis rašyti asinchroninį neblokuojantį kodą aiškesniu ir nuoseklesniu būdu. Ji panaši į srautą (thread), bet yra daug lengvesnė ir gali būti lengvai sukurta dideliu kiekiu.

Pagrindiniai komponentai ir veikimo principai:

  • Suspend Functions (Suspendable Functions): Funkcijos, pažymėtos raktažodžiu suspend, gali laikinai sustabdyti (suspend) savo vykdymą, neblokuodamos srauto, kuriame jos vykdomos. Kai sustabdyta funkcija baigia savo "laukiantį" veiksmą (pvz., tinklo užklausą), ji gali atnaujinti vykdymą nuo sustojimo vietos.
  • Context (Coroutine context): Elementų rinkinys, valdantis korutinų elgseną. Kontekste yra:
    • Job: Korutinų aprašas, leidžiantis valdyti jos gyvavimo ciklą (atšaukimą, laukimą užbaigimo).
    • CoroutineDispatcher: Nustato, kuriame sraute(-uose) bus vykdoma korutina. Leidžia perjungti tarp srautų.
    • CoroutineName: Pasirinktinai pavadinimas derinimui.
    • CoroutineExceptionHandler: Neapdorotų išimčių tvarkytojas.
  • Builders (Kūrėjai): Funkcijos, paleidžiančios korutinų vykdymą:
    • launch: Paleidžia naują korutiną, negrąžindama rezultato. Grąžina Job.
    • async: Paleidžia naują korutiną, kuri grąžina rezultatą (Deferred). Rezultatas gaunamas naudojant .await().
    • runBlocking: Blokuojantis kūrėjas, dažniausiai naudojamas testavimui ar integracijai su blokuojančiu kodu.

Kaip tai veikia po gaubtu:

Korutinai nesukuria atskirų srautų kiekvienai užduočiai. Vietoj to, sustabdžius suspend funkciją, kompiliatorius generuoja kodą, kuris išsaugo esamą skaičiavimų būseną. Kai rezultatas pasiekiamas, korutina atnaujinama viename iš CoroutineDispatcher valdomų srautų. Tai pasiekiama paverčiant suspend funkcijas į asinchroninius iškvietimus su tęsiniais (continuation-passing style), leidžiant vienam srautui vykdyti daugybę korutinų, perjungiant juos sustojimo metu.

Pavyzdys:

import kotlinx.coroutines.*

fun main() = runBlocking { // Blokuoja esamą srautą iki korutinos pabaigos
    println("Pirmas")

    launch { // Paleidžia naują korutiną foniniame režime
        delay(1000L) // Neblokuojantis vėlavimas 1 sekundę
        println("Po vėlavimo")
    }

    println("Tada") // Ši eilutė bus vykdoma iki launch korutinos pabaigos
}

Šio kodo išvestis bus:

Pirmas
Tada
Po vėlavimo

Tai demonstruoja neblokavimo pobūdį launch ir delay.