Sobes.tech
Middle+

Kojim mehanizmima se realizuje kooperativno višezadašnjost u korutinama?

sobes.tech АИ

Одговор од АИ

U korutinama, kooperativno višezadaćno izvršavanje se realizuje putem sledećih mehanizama:

  • Tačke suspendovanja: Korutina može biti "zaustavljena" na određenim tačkama (tačke suspendovanja), bez blokiranja niti. To se dešava prilikom poziva funkcija suspend. Tokom zaustavljanja, nit u kojoj se izvršavala korutina je slobodna za druge zadatke.

  • Dispatchers: Korutine koriste Dispatchers za određivanje niza niti na kojima će se izvršavati. Korutina može biti zaustavljena na jednoj niti i nastavljena na drugoj.

  • Nastavak: Svaki put kada se korutina zaustavi, kreira se objekat Continuation koji čuva stanje korutine u tom trenutku. Kada se korutina nastavi, koristi taj objekat za obnavljanje njenog stanja i nastavak od mesta gde je zaustavljena.

  • Saradnja: Programer eksplicitno navodi tačke suspendovanja (suspend) u kodu. To čini višezadaćnost "saradničkom" – korutina dobrovoljno prepušta kontrolu drugoj korutini ili zadatku na određenim mestima, umesto da bude prinudno prekinuta od strane operativnog sistema, kao u slučaju preemptivnog višezadaćnog izvršavanja.

  • Strukturna konkurencija: Korutine su povezane sa određenim opsegom (CoroutineScope). To omogućava da se grupa korutina otkaže istovremeno i garantuje da će sve ćerke korutine biti završene pri završetku roditeljskog opsega.

// Primer suspend funkcije koja kreira tačku suspendovanja
suspend fun fetchDataFromNetwork(): String {
    // Simulacija mrežnog zahteva
    delay(1000) // Ovo je suspend funkcija - tačka suspendovanja
    return "Podaci primljeni"
}

fun main() = runBlocking {
    // runBlocking kreira CoroutineScope i blokira trenutni nit do završetka korutine
    println("Početak")

    launch {
        // Pokreće korutinu na drugoj niti (ili istoj, u zavisnosti od dispatcher-a)
        val data = fetchDataFromNetwork() // Ovde korutina može biti suspendovana
        println("Primljeno: $data")
    }

    println("Kraj (glavna nit nije blokirana od fetchDataFromNetwork)")
    // Glavna nit može obavljati druge zadatke dok fetchDataFromNetwork čeka
}