Lanzamiento vs Async en Kotlin Coroutines

Requisito previo: Kotlin Coroutines en Android

El equipo de Kotlin define las corrutinas como » subprocesos ligeros «. Son una especie de tareas que los subprocesos reales pueden ejecutar. Las rutinas se agregaron a Kotlin en la versión 1.3 y se basan en conceptos establecidos de otros lenguajes. Las rutinas de Kotlin presentan un nuevo estilo de concurrencia que se puede usar en Android para simplificar el código asincrónico.

La documentación oficial dice que las rutinas son subprocesos ligeros. Por ligero, significa que la creación de rutinas no asigna nuevos subprocesos. En su lugar, utilizan grupos de subprocesos predefinidos y programación inteligente con el propósito de qué tarea ejecutar a continuación y qué tareas más adelante .

Hay principalmente dos funciones en Kotlin para iniciar las rutinas

  • lanzar{ }
  • asíncrono{ }

función de lanzamiento

El lanzamiento no bloqueará el hilo principal, pero por otro lado, la ejecución del resto del código no esperará el resultado del lanzamiento ya que el lanzamiento no es una llamada de suspensión. El siguiente es un programa de Kotlin que usa Launch:

Kotlin

// Kotlin Program For better understanding of launch
fun GFG()
{
  var resultOne = "Android"
  var resultTwo = "Kotlin"
  Log.i("Launch", "Before")
  launch(Dispatchers.IO) { resultOne = function1() }
  launch(Dispatchers.IO) { resultTwo = function2() }
  Log.i("Launch", "After")
  val resultText = resultOne + resultTwo
  Log.i("Launch", resultText)
}
 
suspend fun function1(): String
{
  delay(1000L)
  val message = "function1"
  Log.i("Launch", message)
  return message
}
 
suspend fun function2(): String
{
  delay(100L)
  val message = "function2"
  Log.i("Launch", message)
  return message
}

Cuando ejecute el código en el IDE de Android , el resultado del registro será:

Expected log output

Kotlin

// pseudo kotlin code for demonstration of launch
GlobalScope.launch(Dispatchers.Main)
{
  // do on IO thread
  fetchUserAndSaveInDatabase()
}
 
suspend fun fetchUserAndSaveInDatabase()
{
  // fetch user from network
  // save user in database
  // and do not return anything
}

Como no devuelve nada, podemos usar el lanzamiento para completar esa tarea y luego hacer algo en Main Thread.

¿Cuándo usar el lanzamiento?

El lanzamiento se puede usar en lugares donde los usuarios no desean usar el resultado devuelto, que luego se usa para realizar otro trabajo. Por ejemplo, se puede usar en lugares que involucran tareas como actualizar o cambiar un color, ya que en este caso la información devuelta no sería de utilidad.

Función asíncrona

Async también se usa para iniciar las rutinas, pero bloquea el hilo principal en el punto de entrada de la función en el programa. El siguiente es un programa de Kotlin que usa Async:

Kotlin

// kotlin program for demonstration of async
fun GFG
{
  Log.i("Async", "Before")
  val resultOne = Async(Dispatchers.IO) { function1() }
  val resultTwo = Async(Dispatchers.IO) { function2() }
  Log.i("Async", "After")
  val resultText = resultOne.await() + resultTwo.await()
  Log.i("Async", resultText)
}
 
suspend fun function1(): String
{
  delay(1000L)
  val message = "function1"
  Log.i("Async", message)
  return message
}
 
suspend fun function2(): String
{
  delay(100L)
  val message = "function2"
  Log.i("Async", message)
  return message
}

Un punto importante a tener en cuenta es que Async hace que ambas redes llamen a result1 y result2 en paralelo, mientras que con el lanzamiento de funciones paralelas no se realizan llamadas. Cuando ejecute el código en el IDE de Android , el resultado del registro será:

Expected log output

¿Cuándo usar Async?

Cuando realice dos o más llamadas de red en paralelo, pero debe esperar las respuestas antes de calcular la salida, es decir, use async para los resultados de varias tareas que se ejecutan en paralelo. Si usa async y no espera el resultado, funcionará exactamente igual que el lanzamiento.

Tabla de diferencias

A continuación se muestra la tabla de diferencias entre Launch y Async:

Lanzar

asíncrono

El lanzamiento es básicamente disparar y olvidar. Async básicamente realiza una tarea y devuelve un resultado.
launch{} no devuelve nada. async{ }, que tiene una función await() devuelve el resultado de la rutina.
launch{} no se puede usar cuando necesita la ejecución paralela de llamadas de red. Use asíncrono solo cuando necesite las llamadas de red de ejecución paralela.
launch{} no bloqueará tu hilo principal. Async bloqueará el hilo principal en el punto de entrada de la función await(). 
La ejecución de otras partes del código no esperará el resultado del lanzamiento, ya que el lanzamiento no es una llamada suspendida. La ejecución de las otras partes del código tendrá que esperar el resultado de la función await().
No es posible que el lanzamiento funcione como asíncrono en ningún caso o condición. Si usa async y no espera el resultado, funcionará exactamente igual que el lanzamiento.
El lanzamiento se puede usar en lugares si no necesita el resultado del método llamado.  Use async cuando necesite los resultados de varias tareas que se ejecutan en paralelo. 
Ejemplo: se puede usar en lugares que involucran tareas como actualizar o cambiar el color, como buscar usuario y guardar en la base de datos.  Ejemplo: imagine la condición, cuando tenemos que obtener los datos de dos usuarios de la base de datos mediante dos llamadas de red paralelas y luego usarlas para calcular algunos resultados en función de sus datos. 

Publicación traducida automáticamente

Artículo escrito por lavishgarg26 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *