Sobes.tech
Middle

Jaké mechanismy nabízí Kotlin pro práci s paralelními výpočty?

sobes.tech AI

Odpověď od AI

  • Korulet (Coroutines): Lehká váha vlákna, která umožňují psát asynchronní kód v imperativním stylu a vyhýbat se blokujícím voláním. Jsou založena na znovu spustitelných funkcích a nejsou vázána na nativní vlákna.
  • Dispatchers: Určují vlákno nebo skupinu vláken, na kterém bude korutina spuštěna.
    • Dispatchers.Default: Pro náročné úkoly (například CPU-bound).
    • Dispatchers.IO: Pro I/O operace (například síťové požadavky, práce se soubory).
    • Dispatchers.Main: Pro spuštění kódu na hlavním vlákně (například aktualizace UI v Android aplikaci).
    • Dispatchers.Unconfined: Spouští korutinu na aktuálním vlákně až do prvního volání suspend funkce.
  • Suspend funkce: Funkce, které lze pozastavit a později znovu spustit. Označují se modifikátorem suspend.
  • Context: Obsahuje informace o korutině, například dispatcher, job a zpracovatel výjimek.
  • Job: Reprezentuje životní cyklus korutiny (spuštěna, aktivní, dokončena, zrušena). Umožňuje řídit korutinu (zrušit, čekat na dokončení).
  • Scope: Určuje oblast platnosti pro korutiny a řídí jejich životní cyklus.
  • MutableStateFlow / SharedFlow: V knihovně kotlinx.coroutines.flow umožňují bezpečně sdílet data mezi korutinami.
  • Mutex: Synchronizační primitivum pro ochranu kritických sekcí.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Příklad použití korutin a dispatcheru
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Pracovní korutina: $i")
            delay(100) // Neblokující zpoždění
        }
    }
    println("Korutina spuštěna")
    job.join() // Čeká na dokončení korutiny
    println("Korutina ukončena")
}
// Příklad suspend funkce
suspend fun fetchData(): String {
    delay(1000) // Simulace síťového požadavku
    return "Data přijata"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        counter++
    }
}