Sobes.tech
Middle

Kokius mechanizmus teikia Kotlin, kad dirbtų su paraleliniais skaičiavimais?

sobes.tech AI

Atsakymas iš AI

  • Koručinos (Coroutines): Lengvai srautai, leidžiantys rašyti asinchroninį kodą imperatyviu stiliumi, išvengiant blokuojančių iškvietimų. Pagrįsti atnaujinamomis funkcijomis ir nėra susiję su natūraliais srautais.
  • Dispatchers: Nustato srautą arba srautų baseiną, kuriame bus vykdoma korutina:
    • Dispatchers.Default: resursų intensyviems užduotims (pvz., CPU-pagrįstoms)
    • Dispatchers.IO: I/O operacijoms (pvz., tinklo užklausos, failų tvarkymas)
    • Dispatchers.Main: vykdyti kodą pagrindiniame sraute (pvz., UI atnaujinimas Android programoje)
    • Dispatchers.Unconfined: vykdo korutiną dabartiniame sraute iki pirmojo suspend funkcijos iškvietimo
  • Suspend funkcijos: funkcijos, kurios gali būti sustabdytos ir vėl atnaujintos vėliau. Paženklintos suspend modifikatoriumi.
  • Context: turi informaciją apie korutiną, pvz., dispatcher, job ir klaidų tvarkytoją.
  • Job: atstovauja korutiną gyvenimo ciklui (pradėta, aktyvi, baigta, atšaukta). Leidžia valdyti korutiną (atšaukti, laukti pabaigos)
  • Scope: apibrėžia korutinų matomumo sritį, valdydama jų gyvenimo ciklą.
  • MutableStateFlow / SharedFlow: kotlinx.coroutines.flow bibliotekoje, leidžia saugiai keistis duomenimis tarp korutinų.
  • Mutex: sinchronizacijos primitivas, saugantis kritines sekcijas.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Korutinų ir dispatcher pavyzdys
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Darbo korutina: $i")
            delay(100) // Neužblokuojantis vėlinimas
        }
    }
    println("Korutina pradėta")
    job.join() // Laukiame korutiną užbaigimo
    println("Korutina baigta")
}
// Suspend funkcijos pavyzdys
suspend fun fetchData(): String {
    delay(1000) // Tinklo užklausos imitacija
    return "Duomenys gauti"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

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