Corutine și Concurență Structurată în Kotlin: suspend, CoroutineScope, async și await în Kotlin

Ghid complet pentru Kotlin Coroutines: funcțiile de suspendare (suspend), mașina de stări CPS, concurența structurată cu coroutineScope și execuția paralelă cu async/await.

Sintaxă
coroutineScope { val a = async { ... }; a.await() } | withContext(Dispatchers.IO)

În dezvoltarea aplicațiilor mobile și a serviciilor de backend, blocarea firelor de execuție pentru operațiuni I/O (descărcare de date din rețea, citire de fișiere, interogări de baze de date) duce la blocarea interfeței grafice (ANR – Application Not Responding) sau la epuizarea rapidă a memoriei serverului.

Kotlin Coroutines oferă un model de asincronism de ultra-înaltă performanță: fire de execuție ușoare (Lightweight Threads) gestionate în User Space. O singură aplicație poate rula sute de mii de corutine simultan fără probleme de memorie!

Execuție Paralelă cu Concurență Structurată (coroutineScope)
import kotlinx.coroutines.*

// Funcție asincronă de nivel înalt:
suspend fun incarcaDatePanouControl(): PanouControl = coroutineScope {
    // coroutineScope garantează concurența structurată: dacă oricare dintre apelurile async
    // eșuează cu o excepție, celelalte sarcini active sunt anulate automat în cascadă!

    // Lansăm două descărcări paralele:
    val dateUtilizator: Deferred = async(Dispatchers.IO) {
        descarcaProfilUtilizator()
    }
    
    val dateStatistici: Deferred> = async(Dispatchers.IO) {
        descarcaStatisticiVanzari()
    }

    // Așteptăm ambele rezultate în mod non-blocant cu .await():
    PanouControl(
        utilizator = dateUtilizator.await(),
        statistici = dateStatistici.await()
    )
}

// Funcție de suspendare:
suspend fun descarcaProfilUtilizator(): String {
    delay(500) // delay() suspendă corutina fără a bloca firul fizic!
    return "Dexter"
}

suspend fun descarcaStatisticiVanzari(): List {
    delay(400)
    return listOf(100, 250, 400)
}

data class PanouControl(val utilizator: String, val statistici: List)

Cum Funcționează Sub Capotă (Continuation-Passing Style – CPS)?

La momentul compilării, compilatorul Kotlin transformă fiecare funcție suspend într-o mașină de stări, adăugând un parametru ascuns: Continuation<T>. Când corutina ajunge la un punct de suspendare (ex: delay sau apel de rețea), ea salvează starea curentă a variabilelor locale și cedează firul fizic; când operațiunea I/O se finalizează, runtime-ul apelează continuation.resumeWith(...) pentru a relua execuția exact de unde a rămas!