Sobes.tech
Middle

Kādus mehānismus piedāvā Kotlin paralēliem aprēķiniem?

sobes.tech AI

Atbilde no AI

  • **Korušinas (Coroutines): Vieglie straumes, kas ļauj rakstīt asenhronisko kodu imperatīvā stilā, izvairoties no bloķējošiem izsaukumiem. Balstītas uz atsāktajām funkcijām un nav saistītas ar dabiskiem straumes.
  • Dispatchers: Nosaka straumi vai straumes baseinu, kurā tiks izpildīta korutīna:
    • Dispatchers.Default: resursu intensīviem uzdevumiem (piemēram, CPU-pamatots)
    • Dispatchers.IO: I/O operācijām (piemēram, tīkla pieprasījumi, failu apstrāde)
    • Dispatchers.Main: izpildīt kodu galvenajā straumē (piemēram, UI atjaunināšana Android lietotnē)
    • Dispatchers.Unconfined: izpilda korutīnu pašreizējā straumē līdz pirmajai suspend funkcijai
  • Suspend funkcijas: funkcijas, kuras var apturēt un vēlāk atsākt. Marķētas ar suspend modifikatoru.
  • Context: satur informāciju par korutīnu, piemēram, dispatcher, job un izņēmumu apstrādātāju.
  • Job: pārstāv korutīnas dzīves ciklu (sākta, aktīva, pabeigta, atcelta). Ļauj pārvaldīt korutīnu (atcelt, gaidīt pabeigšanu)
  • Scope: nosaka korutīnu redzamības jomu, pārvaldot to dzīves ciklu.
  • MutableStateFlow / SharedFlow: kotlinx.coroutines.flow bibliotēkā, ļauj droši apmainīties ar datiem starp korutīnām.
  • Mutex: sinhronizācijas primitives, kas aizsargā kritiskās sekcijas.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Korutīnu un dispatcher piemērs
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Darbojošā korutīna: $i")
            delay(100) // Neaizkavējošs aizkaves
        }
    }
    println("Korutīna uzsākta")
    job.join() // Gaidām korutīnas pabeigšanu
    println("Korutīna pabeigta")
}
// Suspend funkcijas piemērs
suspend fun fetchData(): String {
    delay(1000) // Tīkla pieprasījuma imitācija
    return "Dati saņemti"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var skaitītājs = 0

suspend fun incrementCounter() {
    mutex.withLock {
        skaitītājs++
    }
}