Sobes.tech
Middle

¿Cómo rastrea el scope la cancelación de una coroutine?

sobes.tech AI

Respuesta de la IA

Scope realiza un seguimiento de la cancelación de una coroutine mediante el objeto Job. Cada CoroutineScope tiene un Job asociado.

Cuando se crea una nueva coroutine dentro de un CoroutineScope, recibe el Job de ese scope como su Job padre.

El mecanismo de seguimiento de cancelaciones funciona de la siguiente manera:

  1. Cancelación del Scope: Cuando se llama a cancel() en el Job del scope, este cancela recursivamente todos sus Job hijos.
  2. Cancelación de una Coroutine Hija: Al cancelar una coroutine hija (por ejemplo, mediante withContext(NonCancellable)) o en caso de una excepción no manejada, esta informa a su Job padre. El Job padre (del scope) a su vez puede cancelar otras corutinas hijas.
  3. Cancelación Cooperativa: Las corutinas deben ser cooperativas respecto a la cancelación. Esto significa que dentro de la coroutine, el código debe verificar periódicamente si ha sido cancelada para terminar su trabajo correctamente. Las funciones suspend (como delay, operaciones de I/O) verifican automáticamente el estado del Job.

El código puede verificar explícitamente la cancelación usando isActive o ensureActive():

// Ejemplo de verificación de actividad de una coroutine
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Realizar alguna operación larga
            delay(100) // punto de suspensión - verifica automáticamente la cancelación

            // O verificar explícitamente
            if (!isActive) {
                break // Salir del ciclo en caso de cancelación
            }
        }
        println("fetchData coroutine finalizada")
    }
}

El uso de ensureActive() lanza una CancellationException en caso de cancelación:

// Uso de ensureActive()
suspend fun processData() {
    // ... algún trabajo ...
    ensureActive() // Lanzará CancellationException si la coroutine ha sido cancelada
    // ... continuar solo si la coroutine está activa ...
}

CancellationException es la forma estándar de propagar la señal de cancelación. No debe considerarse un error en el contexto de la cancelación de corutinas.

Scope, poseyendo un Job, crea una jerarquía de "padre-hijo" de Job, que permite propagar la señal de cancelación del padre a los hijos. Esto es fundamental para el paralelismo estructurado en las corutinas.