Una función de suspensión solo puede ser llamada desde una corrutina o desde otra función de suspensión.
Las funciones de suspensión llamadas desde una corrutina se ejecutan en forma secuencial por defecto, por ejemplo probemos el siguiente código que llama a dos funciones de suspensión:
import kotlinx.coroutines.* fun main(args: Array<String>) = runBlocking { val d1=dato1() println("Fin de la primera función de suspensión") val d2=dato2() println("Fin de la segundo función de suspensión") print(d1+d2) } suspend fun dato1(): Int { delay(3000) return 3 } suspend fun dato2(): Int { delay(3000) return 3 }
Cuando ejecutamos la aplicación, luego de 4 segundos de su ejecución podemos ver que ha finalizado la función de suspensión 'dato1' y se encuentra ahora ejecutando la función de suspensión 'dato2':
En muchas situaciones las llamadas secuenciales de las funciones de suspensión son la solución correcta, por ejemplo solicitamos a un servidor un dato y a partir de dicho dato hacemos la petición a otro servidor a partir del dato recuperado del primer servidor.
El tiempo de ejecución de las dos funciones de suspensión es aproximadamente de 6 segundos, esto debido a que se ejecutan en forma secuencial.
En algunas situaciones si el problema lo permite podemos ejecutar las funciones de suspensión en forma concurrente y eventualmente si disponemos de varios procesadores la ejecución se puede hacer en paralelo con la ventaja de reducir el tiempo. Veamos la sintaxis para implementar las llamadas a funciones de suspensión en forma concurrente:
import kotlinx.coroutines.* fun main(args: Array<String>) = runBlocking { val tiempo1 = System.currentTimeMillis() val corrutina1=async { dato1() } val corrutina2=async { dato2() } println(corrutina1.await()+corrutina2.await()) val tiempo2 = System.currentTimeMillis() println("Tiempo total ${tiempo2-tiempo1}") } suspend fun dato1(): Int { delay(3000) return 3 } suspend fun dato2(): Int { delay(3000) return 3 }
Como podemos comprobar las dos funciones se ejecutan en forma paralela y por eso el tiempo de ejecución del algoritmo es de 3 segundos.