Ответ
Количество потоков в DefaultDispatcher фиксировано и зависит от ядер процессора, потому что это оптимальное значение для CPU-bound задач. Kotlin Coroutines использует формулу max(2, количество_ядер) для баланса между параллелизмом и накладными расходами на переключение контекста.
Пример:
val cores = Runtime.getRuntime().availableProcessors()
println("DefaultDispatcher threads: ${cores.coerceAtLeast(2)}")
Это компромисс:
- Меньше потоков → меньше contention (конкуренции за ресурсы)
- Достаточно для параллельной обработки
- Избегает oversubscription (когда потоков больше, чем ядер)
Для IO-bound задач лучше использовать Dispatchers.IO, который расширяет пул при необходимости.
Ответ 18+ 🔞
Ну ты представляешь, эта штука с DefaultDispatcher — она как тот самый сосед, который всегда включает ровно столько кондиционеров, сколько комнат в квартире. Не больше, не меньше. А почему? Потому что если впендюрить их овердохуища, то счёт за свет такой придёт, что сам от себя охуеешь.
Так вот, эти корутины — они умные, блядь. Они смотрят на твой процессор и думают: «Э, бошка, думай. Сколько тут ядер?» Берут это число и говорят: «Ладно, но меньше двух — это пиздец, вообще ни о чём». Формула проще пареной репы: max(2, количество_ядер). Как будто хуй с горы — либо два, либо сколько есть.
Вот смотри, код-то какой простой, ёпта:
val cores = Runtime.getRuntime().availableProcessors()
println("DefaultDispatcher threads: ${cores.coerceAtLeast(2)}")
Запустишь — и тебе выведет, сколько этих потоков-работяг под капотом болтается. Всё честно.
А логика-то в чём, спросишь? А логика, чувак, в том, чтобы не устраивать ёперный театр. Если задач, которые мозг процессора жрут (эти самые CPU-bound), раздать на потоков больше, чем ядер, получится чистая пиздопроебибна. Все эти потоки начнут толкаться, переключаться, ресурсы делить — а толку-то? Производительность просядет, как гандон в ледяной воде.
Поэтому компромисс, блядь, золотой:
- Потоков поменьше — меньше драк и очередей (этот самый
contention). - Но их достаточно, чтобы параллельно работать.
- И главное — нет этого самого
oversubscription, когда потоков, как говна за баней, а работать-то некому.
Но это всё, сука, для вычислений. А если твоя задача — не думать, а ждать (типа сетевой запрос или файл читать), то тут уже доверия ебать ноль к DefaultDispatcher. Для этого есть отдельная банда — Dispatchers.IO. Этот шайтан-диспетчер, если надо, накинет потоков сверху, потому что пока один ждёт ответа от сервера, другой может спокойно работать. Вот такая, блядь, хитрая жопа получается.