Sobes.tech
Middle

¿Qué mecanismos proporciona Kotlin para trabajar con cálculos paralelos?

sobes.tech AI

Respuesta de la IA

  • Corutinas (Coroutines): Hilos ligeros que permiten escribir código asíncrono en estilo imperativo, evitando llamadas bloqueantes. Se basan en funciones reanudables y no están vinculadas a hilos nativos.
  • Dispatchers: Determinan el hilo o grupo de hilos en el que se ejecutará la corutina.
    • Dispatchers.Default: Para tareas que consumen muchos recursos (por ejemplo, CPU-bound).
    • Dispatchers.IO: Para operaciones de E/S (por ejemplo, solicitudes de red, trabajo con archivos).
    • Dispatchers.Main: Para ejecutar código en el hilo principal (por ejemplo, actualización de UI en una aplicación Android).
    • Dispatchers.Unconfined: Ejecuta la corutina en el hilo actual hasta la primera llamada a una función suspendida.
  • Funciones suspend: Funciones que pueden ser pausadas y reanudadas más tarde. Se marcan con el modificador suspend.
  • Contexto: Contiene información sobre la corutina, como el dispatcher, el job y el manejador de excepciones.
  • Job: Representa el ciclo de vida de la corutina (en ejecución, activa, finalizada, cancelada). Permite gestionar la corutina (cancelar, esperar a que termine).
  • Scope: Define el ámbito de las corutinas, gestionando su ciclo de vida.
  • MutableStateFlow / SharedFlow: En la biblioteca kotlinx.coroutines.flow, permiten intercambiar datos de forma segura entre corutinas.
  • Mutex: Primitive de sincronización para proteger secciones críticas.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Ejemplo de uso de corutinas y dispatcher
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Corutina de trabajo: $i")
            delay(100) // Retardo no bloqueante
        }
    }
    println("Corutina lanzada")
    job.join() // Espera a que la corutina termine
    println("Corutina finalizada")
}
// Ejemplo de función suspend
suspend fun fetchData(): String {
    delay(1000) // Simulación de solicitud de red
    return "Datos recibidos"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        counter++
    }
}