Czytam Kotlin Coroutine i wiem, że opiera się na suspendfunkcji. Ale co to suspendznaczy?
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 awaitjest 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 suspendzewnętrzny asyncrdzeń, czy suspendwewnętrzny computationrdzeń?
Czy suspendoznacza, że gdy zewnętrzny asyncprogram czeka ( await) na zakończenie wewnętrznego computationprogramu, to (zewnętrzny asyncprogram) pozostaje bezczynny (stąd nazwa zawieszona) i zwraca wątek do puli wątków, a kiedy program potomny computationkończy, to (zewnętrzny asyncprogram ) 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
