es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el tiempo que se tarda es diferente al usar async y await en una coroutine?

Tengo una pregunta mientras aprendo sobre coroutines.

fun main() {
    runBlocking {
        val time = measureTimeMillis {
            val a = async {
                delay(1000)
                "1"
            }
            val b = async {
                delay(1000)
                "2"
            }

        val a1 = a.await()
        val b1 = b.await()
    }

    println(time)
}

Al ejecutar esto, toma 1000.

fun main() {
    runBlocking {
        val time = measureTimeMillis {
            val a = async {
                delay(1000)
                "1"
            }.await()
            val b = async {
                delay(1000)
                "2"
            }.await()
        }

    println(time)
}

Pero al ejecutar esto, toma 2000.

Me gustaría saber por qué sucede esto.
¿El comportamiento cambia dependiendo de si se devuelve el resultado como Deferred o como un valor después de la ejecución?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el segundo bloque de código toma 2000 es porque estás esperando en ambos valores de Deferred secuencialmente, lo que significa que estás bloqueando efectivamente la ejecución hasta que ambas corrutinas hayan sido completadas. Por otro lado, en el primer bloque de código, estás lanzando ambas corrutinas concurrentemente usando la función async y luego esperando en ellas después de que han sido lanzadas. Esto significa que mientras se está ejecutando una corrutina, la otra puede comenzar su ejecución también, lo que conduce a un tiempo total de ejecución de aproximadamente 1000 milisegundos.

    De hecho, el comportamiento cambia dependiendo de si devuelves un valor de Deferred o un valor regular después de la ejecución. Cuando devuelves un valor de Deferred, esencialmente estás devolviendo una promesa de un valor futuro, que será calculado de manera asíncrona. Luego puedes esperar en esta promesa para recuperar el valor final. Cuando devuelves un valor regular después de la ejecución, estás bloqueando implícitamente la ejecución hasta que se calcule el resultado, lo que puede ser una operación costosa. Por lo tanto, generalmente se recomienda usar valores de Deferred cuando necesites realizar operaciones de larga duración de manera asíncrona.

Comments are closed.