Mis on coroutine Kotlinis ja kuidas see töötab?
sobes.tech AI
Vastus AI-lt
Kotlinis korutina on kerge täitmisüksus, mis võimaldab kirjutada asünkroonset ja mitteblokeerivat koodi selgemal ja järjestatum viisil. See sarnaneb vooluga (thread), kuid on palju kergem ja seda saab hõlpsasti luua suurel arvul.
Peamised komponendid ja tööpõhimõtted:
- Suspend Functions (Suspendable Functions): Funktsioonid, mille märgib võtmesõna
suspend, võivad ajutiselt peatada (suspend) oma täitmise, mitte blokeerides seda voolu, milles nad töötavad. Kui peatatud funktsioon lõpetab oma "ootava" operatsiooni (näiteks võrgupäring), saab ta jätkata täitmist samast kohast, kus ta peatati. - Context (Coroutine context): Elementide kogum, mis juhib korutina käitumist. Kontekstis on:
Job: Korutina kirjeldaja, mis võimaldab hallata selle elutsüklit (tühistamine, ootamine lõpetamisele).CoroutineDispatcher: Määrab, millises voolus(tes) korutina täidetakse. Annab võimaluse vahetada voogude vahel.CoroutineName: Valikuline nimi silumiseks.CoroutineExceptionHandler: Töötlusprogramm töötlemata erandite jaoks.
- Builders (Ehitajad): Funktsioonid, mis käivitavad korutinate täitmise:
launch: Käivitab uue korutina, mitte tagastades tulemust. TagastabJob.async: Käivitab uue korutina, mis tagastab tulemuse (Deferred). Tulemuse saamiseks kasutatakse.await().runBlocking: Blokeeriv ehitaja, mida kasutatakse peamiselt testimiseks või blokeeriva koodi integreerimiseks.
Kuidas see töötab põhjas:
Korutinaid ei luuakse iga ülesande jaoks eraldi voogudena. Selle asemel, kui suspend funktsioon peatub, genereerib kompilaator koodi, mis salvestab arvutuste praeguse oleku. Kui tulemus on saadaval, jätkub korutina ühest CoroutineDispatcher-i juhitavast voost. Seda saavutatakse, muutes suspend funktsioonid asünkroonilisteks väljakutseteks jätkudega (continuation-passing style), mis võimaldab ühel voolul täita palju korutinaid, vahetades neid peatamise ajal.
Näide:
import kotlinx.coroutines.*
fun main() = runBlocking { // Blokeerib praeguse voolu kuni korutina lõppemiseni
println("Esiteks")
launch { // Käivitame uue korutina taustal
delay(1000L) // Mitteblokeeriv viivitus 1 sekund
println("Pärast viivitust")
}
println("Seejärel") // See rida täidetakse enne launch korutina lõppu
}
Selle koodi väljund on:
Esiteks
Seejärel
Pärast viivitust
See demonstreerib launch ja delay mitteblokeerivat olemust.