¿Qué es una coroutine en Kotlin y cómo funciona?
sobes.tech AI
Respuesta de la IA
La coroutine en Kotlin es una unidad ligera de ejecución que permite escribir código asíncrono y no bloqueante de manera más legible y secuencial. Es similar a un hilo (thread), pero mucho más ligera y puede ser creada en gran cantidad.
Componentes principales y principios de funcionamiento:
- Funciones Suspendidas (Funciones Suspend): Funciones marcadas con la palabra clave
suspend, que pueden suspender su ejecución sin bloquear el hilo en el que se ejecutan. Cuando una función suspendida termina su operación de "espera" (por ejemplo, una solicitud de red), puede reanudar la ejecución desde donde fue suspendida. - Contexto (Contexto de la Coroutine): Conjunto de elementos que controlan el comportamiento de la coroutine. Incluye:
Job: Descriptor de la coroutine, que permite gestionar su ciclo de vida (cancelación, espera a que termine).CoroutineDispatcher: Define el hilo(s) en el que se ejecutará la coroutine. Permite cambiar entre hilos.CoroutineName: Nombre opcional para depuración.CoroutineExceptionHandler: Manejador de excepciones no controladas.
- Constructores (Builders): Funciones que inician la ejecución de coroutines:
launch: Inicia una nueva coroutine sin devolver resultado. Retorna unJob.async: Inicia una nueva coroutine que devuelve un resultado (Deferred). Para obtener el resultado, se usa.await().runBlocking: Constructor bloqueante, usado principalmente para pruebas o integración con código bloqueante.
Cómo funciona en el fondo:
Las coroutines no crean hilos separados para cada tarea. En lugar de eso, cuando una función suspend se suspende, el compilador genera código que guarda el estado actual de los cálculos. Cuando el resultado está listo, la coroutine se reanuda en uno de los hilos gestionados por CoroutineDispatcher. Esto se logra transformando las funciones suspend en llamadas asíncronas con continuaciones, permitiendo que un solo hilo ejecute múltiples coroutines, cambiando entre ellas cuando se suspenden.
Ejemplo:
import kotlinx.coroutines.*
fun main() = runBlocking { // Bloquea el hilo actual hasta que la coroutine dentro de runBlocking termine
println("Primero")
launch { // Inicia una nueva coroutine en segundo plano
delay(1000L) // Retardo no bloqueante de 1 segundo
println("Después del retardo")
}
println("Luego") // Esta línea se ejecuta antes de que termine la coroutine launch
}
La salida de este código será:
Primero
Luego
Después del retardo
Esto demuestra la naturaleza no bloqueante de launch y delay.