В чем смысл ключевого слова suspend в Kotlin
Что проверяют
Понимаете ли вы, что suspend это про приостановку без блокировки потока, и знаете ли, во что компилятор превращает такую функцию.
Как отвечать
suspend помечает функцию, которая может приостановиться и продолжиться позже. Пока она ждёт, поток свободен и выполняет другие корутины. Именно этим корутины отличаются от потоков: ожидание не занимает поток.
Технически компилятор превращает такую функцию в конечный автомат и добавляет скрытый параметр Continuation, через который возвращается управление. Отсюда правило: вызвать приостанавливаемую функцию можно только из другой приостанавливаемой функции или из корутины, ведь обычному коду нечего передать в этот параметр.
Что важно понимать про границы:
suspendсам по себе не делает работу асинхронной. Тяжёлый расчёт внутри такой функции всё равно займёт поток целиком. Асинхронность даёт то, что внутри вызывается по-настоящему приостанавливаемая операция;- приостановка происходит только в точках приостановки: вызовы других
suspend-функций,delay,withContext. Между ними код обычный; - отмена кооперативная и проверяется именно в этих точках, поэтому цикл без них не отменится;
- хорошая практика: функция сама выбирает диспетчер через
withContext, а вызывающий не думает, откуда её звать.
Где спотыкаются
Считают, что suspend автоматически уводит работу в фоновый поток.
Зовут блокирующий вызов внутри приостанавливаемой функции и занимают поток.
Не понимают, почему такую функцию нельзя вызвать из обычного метода.
Путают suspend и async: первый про приостановку, второй про параллельный запуск с результатом.