51 - Corrutinas: runBlocking y coroutineScope

Además del alcance de la corrutina proporcionado por diferentes constructores, es posible declarar su propio alcance utilizando el constructor coroutineScope. Crea un alcance de corrutina y no se completa hasta que se completan todos los elementos secundarios iniciados.

Los constructores de corrutinas runBlocking y coroutineScope pueden parecer similares porque ambos esperan que su cuerpo y todos sus elementos secundarios se completen. La principal diferencia es que el método runBlocking bloquea el hilo actual para esperar, mientras que coroutineScope simplemente suspende, liberando el hilo subyacente para otros usos. Debido a esa diferencia, runBlocking es una función regular y coroutineScope es una función de suspensión.

Se puede utilizar un constructor coroutineScope dentro de cualquier función de suspensión para realizar múltiples operaciones simultáneas.

import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) = runBlocking {
    Tareas(1)
    Tareas(2)
    println("Fin de todas las tareas")
}

suspend fun Tareas(nro:Int) = coroutineScope {
    launch {
        delay(1000)
        println("Tarea $nro parte A")
    }
    launch {
        delay(2000)
        println("Tarea $nro parte B")
    }
    println("Esperando finalizar las dos tareas $nro")
}
Coroutines runBlocking y coroutineScope

Es importante notar que cuando llamamos a:

    Tareas(1)

La corrutina de la main se bloquea hasta que finaliza la función de suspensión 'Tareas', pero dentro de la misma cuando se llaman a las corrutinas con launch la función de suspensión continua y espera hasta que todas las corrutinas finalicen.