Sobes.tech
Middle+

Por meio de quais mecanismos nas corrotinas é implementado o multitarefa cooperativa?

sobes.tech IA

Resposta da IA

Nas corrotinas, a multitarefa cooperativa é implementada através dos seguintes mecanismos:

  • Pontos de suspensão: A coroutine pode ser "suspensa" em pontos específicos (pontos de suspensão), sem bloquear a thread. Isto acontece ao chamar funções suspend. Durante a suspensão, a thread na qual a coroutine estava a ser executada fica livre para realizar outras tarefas.

  • Dispatchers: As corrotinas usam Dispatchers para determinar o pool de threads onde serão executadas. Uma coroutine pode ser suspensa numa thread e retomada noutra.

  • Continuação: Sempre que uma coroutine é suspensa, um objeto Continuation é criado, que armazena o estado da coroutine nesse momento. Quando a coroutine é retomada, ela usa esse objeto para restaurar o seu estado e continuar de onde foi suspensa.

  • Cooperação: O programador indica explicitamente os pontos de suspensão (suspend) no código. Isto torna a multitarefa "cooperativa": a coroutine cede voluntariamente o controlo a outra coroutine ou tarefa em certos pontos, em vez de ser interrompida forçosamente pelo sistema operativo, como na multitarefa preemptiva.

  • Concorrência estruturada: As corrotinas estão vinculadas a um âmbito (CoroutineScope). Isto permite cancelar um grupo de corrotinas simultaneamente e garante que todas as corrotinas filhas sejam concluídas ao terminar o âmbito pai.

// Exemplo de função suspend que cria um ponto de suspensão
suspend fun fetchDataFromNetwork(): String {
    // Simulação de uma requisição de rede
    delay(1000) // É uma função suspend - ponto de suspensão
    return "Dados recebidos"
}

fun main() = runBlocking {
    // runBlocking cria um CoroutineScope e bloqueia a thread atual até a coroutine terminar
    println("Início")

    launch {
        // Inicia uma coroutine numa outra thread (ou na mesma, dependendo do dispatcher)
        val data = fetchDataFromNetwork() // Aqui a coroutine pode ser suspensa
        println("Recebido: $data")
    }

    println("Fim (a thread principal não está bloqueada por fetchDataFromNetwork)")
    // A thread principal pode realizar outras tarefas enquanto fetchDataFromNetwork espera
}