Me cuesta entender las rutinas. Esta es una configuración muy simple. Tanto longComputation como delay son funciones suspendidas. El primero bloquea el hilo principal, el segundo no. ¿Por qué?
CoroutineScope(Dispatchers.Main).launch { val result = longComputation() // Blocks delay(10_000) // Doesn't block }Eso depende. ¿Qué hace longComputation exactamente? Cuando marca una función como suspend , esto no significa que no pueda incluir código de bloqueo en ella. Por ejemplo, echa un vistazo a este:
suspend fun blockingSuspendFunction(){ BigInteger(1500, Random()).nextProbablePrime() }El código dentro de la función de suspensión es obviamente algo que utiliza la CPU y bloquea a la persona que llama. Por convención , esto no debe hacerse porque si llama a una función de suspensión, espera que no bloquee el hilo:
Convención: las funciones de suspensión no bloquean el subproceso de la persona que llama. ( https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761 )
Para hacer que dicha función "se comporte como una función de suspensión", el bloqueo debe enviarse a otro subproceso de trabajo, lo que (por recomendación) debería ocurrir con withContext :
suspend fun blockingSuspendFunction() = withContext(Dispatchers.Default) { BigInteger.probablePrime(2048, Random()) }