¿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?
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ónasync
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 deDeferred
, 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 deDeferred
cuando necesites realizar operaciones de larga duración de manera asíncrona.