Sto leggendo Kotlin Coroutine e so che si basa sulla suspendfunzione. Ma cosa vuol suspenddire?
La coroutine o la funzione vengono sospese?
Da https://kotlinlang.org/docs/reference/coroutines.html
Fondamentalmente, le coroutine sono calcoli che possono essere sospesi senza bloccare un thread
Ho sentito spesso la gente dire "sospendi la funzione". Ma penso che sia la coroutine che viene sospesa perché aspetta che la funzione finisca? "sospendere" di solito significa "cessare l'operazione", in questo caso la coroutine è inattiva.
🤔 Dovremmo dire che la coroutine è sospesa?
Quale coroutine viene sospesa?
Da https://kotlinlang.org/docs/reference/coroutines.html
Per continuare l'analogia, await () può essere una funzione di sospensione (quindi richiamabile anche dall'interno di un blocco {} asincrono) che sospende una coroutine fino a quando non viene eseguito un calcolo e restituisce il risultato:
async { // Here I call it the outer async coroutine
...
// Here I call computation the inner coroutine
val result = computation.await()
...
}
🤔 Dice "che sospende una coroutine fino al completamento di alcuni calcoli", ma la coroutine è come un thread leggero. Quindi se la coroutine è sospesa, come può essere eseguito il calcolo?
Vediamo che awaitè chiamato computation, quindi potrebbe essere asyncche ritorni Deferred, il che significa che può avviare un'altra coroutine
fun computation(): Deferred<Boolean> {
return async {
true
}
}
🤔 La citazione dice che sospende una coroutine . Significa suspendla asynccoroutine esterna o suspendla computationcoroutine interna ?
Fa suspendche mentre esterna media asynccoroutine è in attesa ( await) per l'interno computationcoroutine alla fine, esso (l'esterno asynccoroutine) gira al minimo (da qui il nome di sospensione) e torna thread per il pool di thread, e quando il bambino computationfiniture coroutine, esso (l'esterno asynccoroutine ) si sveglia, prende un altro thread dal pool e continua?
Il motivo per cui cito il thread è a causa di https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
Il thread viene restituito al pool mentre la coroutine è in attesa, e quando l'attesa è terminata, la coroutine riprende su un thread libero nel pool
