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
Dispatcherspara 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
}