¿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:
- Cancelación del Scope: Cuando se llama a
cancel()en elJobdel scope, este cancela recursivamente todos susJobhijos. - 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 suJobpadre. ElJobpadre (del scope) a su vez puede cancelar otras corutinas hijas. - 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 delJob.
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.