Milliste mehhanismide kaudu realiseeritakse koostöövõimeline multitasking korutüünides?
sobes.tech AI
Vastus AI-lt
Korutinate koostööpõhine mitmeülesande täitmine realiseeritakse järgmiste mehhanismide kaudu:
-
Suspension Points: Korutina võib olla "peatatud" teatud punktides (suspension points), mitte blokeerides niiti. See toimub
suspendfunktsioonide väljakutsel. Peatamise ajal on niit, kus korutina täideti, vaba teiste ülesannete täitmiseks. -
Dispatchers: Korutinad kasutavad
Dispatchersnende täitmiseks mõeldud niidupulga määramiseks. Korutina võib olla peatatud ühel niidil ja jätkata teisel. -
Continuation: Iga kord, kui korutina peatub, luuakse
Continuationobjekt, mis salvestab korutina oleku sellel hetkel. Kui korutina jätkub, kasutab see objekti oleku taastamiseks ja täitmise jätkamiseks sellest kohast, kus see peatati. -
Cooperation: Arendaja täpsustab selgelt peatamise punktid (
suspend) koodis. See muudab mitmeülesandelise täitmise "kooperatiivseks" – korutina vabatahtlikult annab kontrolli teisele korutinale või ülesandele teatud kohtades, selle asemel, et see oleks sunniviisiliselt katkestatud operatsioonisüsteemi poolt, nagu preemptive mitmeülesandelise täitmise puhul. -
Structured Concurrency: Korutinad on seotud kindla nähtavuspiirkonnaga (
CoroutineScope). See võimaldab korraga tühistada rühma korutinasid ja tagab, et kõik lapsekorutinaid lõpetatakse vanempiirkonna lõpetamisel.
// Näide suspend funktsioonist, mis loob suspension punkti
suspend fun fetchDataFromNetwork(): String {
// Võrgu päringu imiteerimine
delay(1000) // See on suspend funktsioon - peatamise punkt
return "Andmed saadud"
}
fun main() = runBlocking {
// runBlocking loob CoroutineScope ja blokeerib praeguse niidi kuni korutina lõppemiseni
println("Algus")
launch {
// Käivitame korutina teises niidis (või samas, sõltuvalt dispatcherist)
val data = fetchDataFromNetwork() // Siin võib korutina olla peatatud
println("Saadud: $data")
}
println("Lõpp (peamine niit ei ole blokeeritud fetchDataFromNetwork)")
// Peamine niit võib täita teisi ülesandeid, kuni fetchDataFromNetwork ootab
}