Como é que o scope rastreia o cancelamento de uma coroutine?
sobes.tech IA
Resposta da IA
O escopo acompanha o cancelamento de uma coroutine através do objeto Job. Cada CoroutineScope possui um Job associado.
Quando uma nova coroutine é criada dentro de um CoroutineScope, ela recebe o Job desse escopo como seu Job pai.
O mecanismo de acompanhamento de cancelamento funciona da seguinte forma:
- Cancelamento do Escopo: Quando
cancel()é chamado noJobdo escopo, ele cancela recursivamente todos os seusJobfilhos. - Cancelamento de uma Coroutine Filha: Ao cancelar uma coroutine filha (por exemplo, via
withContext(NonCancellable)) ou em caso de uma exceção não tratada, ela informa seuJobpai. OJobpai (do escopo) por sua vez pode cancelar outras suas coroutines filhas. - Cancelamento Cooperativo: As coroutines devem ser cooperativas em relação ao cancelamento. Isso significa que dentro da coroutine, o código deve verificar periodicamente se foi cancelado para terminar seu trabalho corretamente. As funções suspend (como
delay, operações de I/O) verificam automaticamente o estado doJob.
O código pode verificar explicitamente o cancelamento usando isActive ou ensureActive():
// Exemplo de verificação de atividade de uma coroutine
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Executa alguma operação longa
delay(100) // ponto de suspensão - verifica automaticamente o cancelamento
// Ou verifica explicitamente
if (!isActive) {
break // Sai do ciclo em caso de cancelamento
}
}
println("fetchData coroutine finalizada")
}
}
O uso de ensureActive() lança uma CancellationException em caso de cancelamento:
// Uso de ensureActive()
suspend fun processData() {
// ... algum trabalho ...
ensureActive() // Lança CancellationException se a coroutine for cancelada
// ... continua o trabalho apenas se a coroutine estiver ativa ...
}
CancellationException é a forma padrão de propagar o sinal de cancelamento. Não deve ser considerado um erro no contexto do cancelamento de coroutines.
O escopo, possuindo um Job, cria uma hierarquia "pai-filho" de Job, que permite propagar o sinal de cancelamento do pai para os filhos. Isso é fundamental para o paralelismo estruturado nas coroutines.