Sobes.tech
Middle

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:

  1. Cancelamento do Escopo: Quando cancel() é chamado no Job do escopo, ele cancela recursivamente todos os seus Job filhos.
  2. 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 seu Job pai. O Job pai (do escopo) por sua vez pode cancelar outras suas coroutines filhas.
  3. 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 do Job.

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.