Sobes.tech
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.flow umožň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++
    }
}