Achieving concurrency in Ktor
Looking back at the code we've written in this chapter, you may be under the impression that the Ktor code is not concurrent at all. However, this couldn't be further from the truth.
All the Ktor functions we've used in this chapter are based on coroutines and the concept of suspending functions.
For every incoming request, Ktor will start a new coroutine that will handle it, thanks to the CIO server engine, which is based on coroutines at its core. Having a concurrency model that is performant but not obtrusive is a very important principle in Ktor.
In addition, the routing
blocks we used to specify all our endpoints have access to CoroutineScope
, meaning that we can invoke suspending functions within those blocks.
One of the examples for such a suspending function is call.respond()
, which we were using throughout this chapter. Suspending functions provide our application with opportunities to context switch, and to execute...