Kas ir korutīna Kotlin un kā tā darbojas?
sobes.tech AI
Atbilde no AI
Kotlin korutīna ir viegli izpildāma vienība, kas ļauj rakstīt asinhrono, neblokējošu kodu skaidrākā un secīgākā veidā. Tā ir līdzīga plūsmai (thread), bet daudz vieglāka un to var viegli izveidot lielā daudzumā.
Galvenās sastāvdaļas un darbības principi:
- Suspend Functions (Suspendable Functions): Funkcijas, kuras ir atzīmētas ar atslēgvārdu
suspend, var pagaidu apturēt (suspendēt) savu izpildi, neblokējot to plūsmu, kurā tās tiek izpildītas. Kad apturētā funkcija pabeidz savu "gaidošo" operāciju (piemēram, tīkla pieprasījumu), tā var atsākt izpildi no vietas, kur tā tika apturēta. - Context (Coroutine context): Elementu kopums, kas pārvalda korutīnas uzvedību. Kontekstā ietilpst:
Job: Korutīnas apraksts, kas ļauj pārvaldīt tās dzīves ciklu (atsaukt, gaidīt pabeigšanu).CoroutineDispatcher: Nosaka, kurā plūsmā(t) tiks izpildīta korutīna. Ļauj pārslēgties starp plūsmām.CoroutineName: Neobligāts nosaukums atkļūdošanai.CoroutineExceptionHandler: Neapstrādātu izņēmumu apstrādātājs.
- Builders (Ēkas): Funkcijas, kas uzsāk korutīnu izpildi:
launch: Uzsāk jaunu korutīnu, nesniedzot rezultātu. AtgriežJob.async: Uzsāk jaunu korutīnu, kas atgriež rezultātu (Deferred). Rezultātu iegūst ar.await().runBlocking: Bloķējošs būvētājs, galvenokārt lietojams testēšanai vai integrācijai ar bloķējošu kodu.
Kā tas darbojas zem pārsega:
Korutīnas neveido atsevišķus plūsmas katram uzdevumam. Tā vietā, apturot suspend funkciju, kompilators ģenerē kodu, kas saglabā pašreizējo aprēķinu stāvokli. Kad rezultāts ir pieejams, korutīna atsāk darbu vienā no CoroutineDispatcher pārvaldītajām plūsmām. Tas tiek panākts, pārveidojot suspend funkcijas par asīnhroniskajiem izsaukumiem ar turpinājumiem (continuation-passing style), kas ļauj vienai plūsmai izpildīt vairākas korutīnas, pārslēdzoties starp tām apturēšanas laikā.
Piemērs:
import kotlinx.coroutines.*
fun main() = runBlocking { // Bloķē pašreizējo plūsmu līdz korutīnas beigām
println("Vispirms")
launch { // Sāk jaunu korutīnu fonā
delay(1000L) // Neblokējošs aizkaves laiks 1 sekunde
println("Pēc aizkaves")
}
println("Tad") // Šī rinda tiks izpildīta pirms launch korutīnas pabeigšanas
}
Šī koda izvade būs:
Vispirms
Tad
Pēc aizkaves
Tas demonstrē neblokējošo raksturu launch un delay.