Czytam Kotlin Coroutine i wiem, że opiera się na suspend
funkcji. Ale co to suspend
znaczy?
Program lub funkcja zostaje zawieszona?
Z https://kotlinlang.org/docs/reference/coroutines.html
Zasadniczo programy te to obliczenia, które można zawiesić bez blokowania wątku
Słyszałem, jak ludzie często mówią „wstrzymaj funkcję”. Ale myślę, że to coroutine zostaje zawieszony, ponieważ czeka na zakończenie funkcji? „zawieszenie” zwykle oznacza „zaprzestanie działania”, w tym przypadku program jest bezczynny.
🤔 Czy powinniśmy powiedzieć, że program jest zawieszony?
Który program zostaje zawieszony?
Z https://kotlinlang.org/docs/reference/coroutines.html
Kontynuując analogię, await () może być funkcją wstrzymującą (stąd również wywoływaną z poziomu bloku async {}), która zawiesza program do czasu wykonania pewnych obliczeń i zwraca jego wynik:
async { // Here I call it the outer async coroutine
...
// Here I call computation the inner coroutine
val result = computation.await()
...
}
🤔 Jest tam napisane „że zawiesza program do czasu wykonania niektórych obliczeń”, ale program ten jest jak lekki wątek. Jeśli więc program jest zawieszony, jak można wykonać obliczenia?
Widzimy, że await
jest wywoływana computation
, więc może się zdarzyć, async
że powróci Deferred
, co oznacza, że może rozpocząć kolejny program
fun computation(): Deferred<Boolean> {
return async {
true
}
}
🤔 Cytat mówi, że zawiesza program . Czy to oznacza suspend
zewnętrzny async
rdzeń, czy suspend
wewnętrzny computation
rdzeń?
Czy suspend
oznacza, że gdy zewnętrzny async
program czeka ( await
) na zakończenie wewnętrznego computation
programu, to (zewnętrzny async
program) pozostaje bezczynny (stąd nazwa zawieszona) i zwraca wątek do puli wątków, a kiedy program potomny computation
kończy, to (zewnętrzny async
program ) budzi się, bierze kolejny wątek z puli i kontynuuje?
Powodem, dla którego wspominam o wątku, jest https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
Wątek jest zwracany do puli, gdy program oczekuje, a po zakończeniu oczekiwania proces zostaje wznowiony na wolnym wątku w puli