The CoroutineDispatcher that is designed for offloading blocking IO tasks to a shared pool of threads. Additional threads in this pool are created on demand. Default IO pool size is
64; on JVM it can be configured using JVM-specific mechanisms, please refer to
Dispatchers.IO documentation on JVM platform.
Elasticity for limited parallelism
Dispatchers.IO has a unique property of elasticity: its views obtained with CoroutineDispatcher.limitedParallelism are not restricted by the
Dispatchers.IO parallelism. Conceptually, there is a dispatcher backed by an unlimited pool of threads, and both
Dispatchers.IO and views of
Dispatchers.IO are actually views of that dispatcher. In practice this means that, despite not abiding by
Dispatchers.IO's parallelism restrictions, its views share threads and resources with it.
In the following example
// 100 threads for MySQL connection
val myMysqlDbDispatcher = Dispatchers.IO.limitedParallelism(100)
// 60 threads for MongoDB connection
val myMongoDbDispatcher = Dispatchers.IO.limitedParallelism(60)
the system may have up to
64 + 100 + 60 threads dedicated to blocking tasks during peak loads, but during its steady state there is only a small number of threads shared among