Sto leggendo Kotlin Coroutine e so che si basa sulla suspend
funzione. Ma cosa vuol suspend
dire?
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 async
che 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 suspend
la async
coroutine esterna o suspend
la computation
coroutine interna ?
Fa suspend
che mentre esterna media async
coroutine è in attesa ( await
) per l'interno computation
coroutine alla fine, esso (l'esterno async
coroutine) gira al minimo (da qui il nome di sospensione) e torna thread per il pool di thread, e quando il bambino computation
finiture coroutine, esso (l'esterno async
coroutine ) 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