Middle
Aké mechanizmy poskytuje Kotlin na prácu s paralelnými výpočtami?
sobes.tech AI
Odpoveď od AI
- Korušiny (Coroutines): Ľahké vlákna, ktoré umožňujú písanie asynchrónneho kódu v imperatívnom štýle, pričom sa vyhýbajú blokujúcim volaniam. Sú založené na znovu spustiteľných funkciách a nie sú viazané na nativne vlákna.
- Dispatchers: Určujú vlákno alebo skupinu vlákien, na ktorom bude korutina vykonaná.
Dispatchers.Default: Pre úlohy náročné na zdroje (napríklad CPU-bound).Dispatchers.IO: Pre operácie vstupu/výstupu (napríklad sieťové požiadavky, práca so súbormi).Dispatchers.Main: Pre vykonávanie kódu na hlavnom vlákne (napríklad aktualizácia UI v Android aplikácii).Dispatchers.Unconfined: Vykonáva korutinu na aktuálnom vlákne až do prvého volania suspend funkcie.
- Suspend funkcie: Funkcie, ktoré môžu byť pozastavené a neskôr pokračovať. Označujú sa modifierom
suspend. - Context: Obsahuje informácie o korutine, ako dispatcher, job a handler výnimiek.
- Job: Reprezentuje životný cyklus korutiny (spustená, aktívna, ukončená, zrušená). Umožňuje riadiť korutinu (zrušiť, čakať na ukončenie).
- Scope: Definuje rozsah pre korutiny, riadiaci ich životný cyklus.
- MutableStateFlow / SharedFlow: V knižnici
kotlinx.coroutines.flowumožňujú bezpečnú výmenu dát medzi korutinami. - Mutex: Primitív synchronizácie na ochranu kritických sekcií.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Príklad použitia korutín a dispatcheru
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Pracovná korutina: $i")
delay(100) // Neblokujúce oneskorenie
}
}
println("Korutina spustená")
job.join() // Čaká na ukončenie korutiny
println("Korutina ukončená")
}
// Príklad suspend funkcie
suspend fun fetchData(): String {
delay(1000) // Simulácia sieťovej požiadavky
return "Dáta prijaté"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}