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.flowumožň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++
}
}