Какой поток используется по умолчанию для вычислений в Kotlin Coroutines?
Что проверяют
Знаете ли вы диспетчеры и, главное, понимаете ли, что «по умолчанию» зависит от скоупа. На Android это ключевой нюанс: следом обычно спрашивают, в каком потоке выполнится код внутри viewModelScope.launch.
Как отвечать
Короткий ответ: если в контексте корутины нет диспетчера, используется Dispatchers.Default. Так происходит в GlobalScope.launch и в CoroutineScope(Job()). Но корутина наследует диспетчер от скоупа, а скоупы из Jetpack настроены иначе:
viewModelScopeиlifecycleScope: работают наDispatchers.Main.immediate, то есть на главном потоке. Тяжёлый расчёт прямо вlaunchзаморозит интерфейс;Dispatchers.Default: пул для вычислений, потоков столько, сколько ядер, но не меньше двух. Сортировка, парсинг большого JSON, обработка изображений;Dispatchers.IO: для блокирующего ввода-вывода. Делит потоки сDefault, но допускает больше одновременных задач: по умолчанию 64 или число ядер, если их больше. ЧерезDispatchers.IO.limitedParallelism(n)можно выделить ограниченный срез;Dispatchers.Main: главный поток, на Android его предоставляетkotlinx-coroutines-android;runBlocking: исключение, крутит цикл событий на текущем потоке и блокирует его.
Правильный шаблон: запускать в viewModelScope, а переключаться точечно через withContext(Dispatchers.Default) внутри репозитория или use case, чтобы функция была безопасна для вызова с главного потока. Диспетчер лучше внедрять через конструктор: в тестах его подменяет StandardTestDispatcher, а главный заменяет Dispatchers.setMain.
Где спотыкаются
Считают, что suspend сама по себе уводит работу в фон. Модификатор только разрешает приостановку, поток не меняется, пока вы явно не вызовете withContext.
Гоняют вычисления на Dispatchers.IO. Потоков там больше, чем ядер, и CPU-задачи конкурируют друг с другом. Обратная ошибка, блокирующий вызов на Default, отнимает потоки у вычислений.
Пишут Dispatcher.Default или MainDispatcher. Таких имён нет, правильно Dispatchers.Default и Dispatchers.Main, и неточность в названиях сразу бросается в глаза.