Sobes.tech
Middle

Milliseid mehhanisme pakub Kotlin paralleelsete arvutuste jaoks?

sobes.tech AI

Vastus AI-lt

  • **Korutiinid (Coroutines): Kerged voolud, mis võimaldavad kirjutada asünkroonset koodi imperatiivses stiilis, vältides blokeerivaid kõnesid. Põhineb taastuvatel funktsioonidel ja ei ole seotud natiivsete vooludega.
  • Dispatchers: Määrab voolu või voolude bassein, kus korutina täidetakse:
    • Dispatchers.Default: ressursimahukate ülesannete jaoks (nt CPU-põhine)
    • Dispatchers.IO: I/O operatsioonidele (nt võrgupäringud, failidega töötamine)
    • Dispatchers.Main: koodi täitmine peamisel voolul (nt UI uuendamine Android rakenduses)
    • Dispatchers.Unconfined: täidab korutina praegusel voolul kuni esimese suspend-funktsiooni kutsumiseni
  • Suspend-funktsioonid: funktsioonid, mida saab peatada ja hiljem jätkata. Märgitud suspend modifikaatoriga.
  • Context: sisaldab teavet korutina kohta, näiteks dispatcher, job ja erandite töötleja.
  • Job: esindab korutina elutsüklit (käivitatud, aktiivne, lõpetatud, tühistatud). Võimaldab hallata korutinat (tühistada, oodata lõpetamist)
  • Scope: määrab korutinate nähtavusala, juhtides nende elutsüklit.
  • MutableStateFlow / SharedFlow: kotlinx.coroutines.flow raamatukogus, võimaldab turvaliselt andmeid vahetada korutinate vahel.
  • Mutex: sünkroniseerimise primitiiv, mis kaitseb kriitilisi sektsioone.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Korutinate ja dispatcher kasutamise näide
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Töötav korutina: $i")
            delay(100) // Mitte-blokeeriv viivitus
        }
    }
    println("Korutina käivitus")
    job.join() // Ootame korutina lõpetamist
    println("Korutina lõpetas")
}
// Suspend-funktsiooni näide
suspend fun fetchData(): String {
    delay(1000) // Võrgu päringu imiteerimine
    return "Andmed saadud"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

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