One of the key concepts of coroutines in Kotlin is that a suspend function must be called from a coroutine or another suspend function.
However, a suspend function can call any kind of function, suspend or normal.
What is the consequence of that? (This is not a real scenario i have, just want to know for theoretical reasons)
I imagine that in that scenario the only point of creating a coroutine would be to change the context (thread) before calling it, so it doesn´t block the main thread. However, would all the other advantages of coroutines be lost? (cooperative cancellation, structured concurrency...)
The syntax of a suspending function is similar to that of a regular function except for the addition of the suspend keyword. It can take a parameter and have a return type. However, suspending functions can only be invoked by another suspending function or within a coroutine.
Hunting to know BLOCKING vs SUSPENDINGA process is blocked when there is some external reason that it can not be restarted, e.g., an I/O device is unavailable, or a semaphore file is locked. A process is suspended means that the OS has stopped executing it, but that could just be for time-slicing (multitasking).
Suspend function is a function that could be started, paused, and resume. One of the most important points to remember about the suspend functions is that they are only allowed to be called from a coroutine or another suspend function.
Suspending a coroutine does not block the underlying thread, but allows other coroutines to run and use the underlying thread for their code. runBlocking is also a coroutine builder that bridges the non-coroutine world of a regular fun main() and the code with coroutines inside of runBlocking { ... } curly braces.
If a suspending function calls another suspending function, then the coroutine is suspended, until the result is returned.
Calling a regular function from a suspending function will block the thread. Which thread? Well, that depends on the Dispatcher you're using. IO
is able to spawn hundred of threads. But the Default
dispatcher has same amount of threads as your CPUs count. Meaning that while this won't block other coroutines, it will reduce the amount of available resources.
Meaning: don't invoke non-suspending function that may block for a long period of time on this dispatcher, same as you don't block your UI
thread.
And yes, suspending function may produce the same results, if you're do something like a busy loop without yield()
or any other suspend invocation in it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With