Что такое Kotlin Coroutines
Что проверяют
Понимаете ли вы, что корутина это не поток, и знаете ли про структурированную конкурентность и отмену.
Как отвечать
Корутина это приостанавливаемая задача. Функция с suspend умеет остановиться на ожидании и отдать поток другим задачам, а потом продолжить с того же места. Компилятор превращает такую функцию в конечный автомат, никакой блокировки потока не происходит.
Отсюда главное отличие от потоков: тысячи корутин живут на нескольких потоках, переключение стоит вызова функции, а не работы планировщика ядра.
Ключевые части:
- CoroutineScope: область, задающая время жизни. Отмена области отменяет всех потомков, и область не завершится, пока они не закончат. Это структурированная конкурентность;
- Dispatchers: где выполнять.
Mainдля интерфейса,IOдля сети и диска,Defaultдля вычислений; - launch и async: первый запускает задачу без результата, второй возвращает
Deferredс результатом; - отмена кооперативная: корутина обязана её проверять. Долгий цикл без точек приостановки не отменится, для этого есть
ensureActiveиyield; - Flow: поток значений во времени с теми же правилами.
В Android области готовые: viewModelScope и lifecycleScope, они отменяются вместе с владельцем и снимают целый класс утечек.
Где спотыкаются
Называют корутину лёгким потоком и не могут объяснить, что значит приостановка.
Используют GlobalScope, теряя отмену и получая утечки.
Ловят CancellationException общим catch и ломают отмену.
Считают Dispatchers.IO бесконечным: там пул с ограничением, и блокирующие вызовы его исчерпывают.