Может ли suspend функция работать вне CoroutineScope
Что проверяют
Различаете ли вы языковой механизм suspend и библиотечное понятие CoroutineScope из kotlinx.coroutines. Ответ «нет, будет ошибка компиляции» верен наполовину, и следом обычно спрашивают, что компилятор делает с suspend функцией и в каком потоке она выполнится.
Как отвечать
Правило компилятора звучит так: suspend функцию можно вызвать только из корутины или из другой suspend функции, иначе ошибка компиляции. Про CoroutineScope в этом правиле ни слова.
Под капотом компилятор делает CPS-преобразование: добавляет функции скрытый параметр Continuation и превращает тело в конечный автомат по точкам приостановки. Значит, для вызова нужен только Continuation, и получить его можно без всякого scope:
suspend fun main(): язык поддерживает такую точку входа напрямую;startCoroutineиcreateCoroutine: низкоуровневый API стандартной библиотекиkotlin.coroutines, запускает корутину без kotlinx.coroutines;sequence { }:yield()внутри этоsuspendвызов, аSequenceScopeне являетсяCoroutineScope.
Scope нужен для другого: это структурированная конкурентность, отмена и обработка ошибок дочерних корутин. В Android-приложении корутину запускают в viewModelScope или lifecycleScope, а если внутри suspend функции надо распараллелить работу, берут coroutineScope { }: он создаёт scope, привязанный к вызывающей корутине.
Второй важный момент: suspend не означает «в фоне». Функция выполняется в потоке вызывающего диспетчера, и если её вызвали из Dispatchers.Main, блокирующий код внутри остановит главный поток. Переключение делает withContext(Dispatchers.IO).
Где спотыкаются
Пишут в сигнатуре suspend и считают, что сетевой вызов или чтение файла ушли с главного потока. Без withContext получается ANR.
Затыкают ошибку компиляции через runBlocking в Activity или GlobalScope.launch. Первый блокирует главный поток, второй помечен @DelicateCoroutinesApi и живёт дольше экрана.
Создают CoroutineScope(Dispatchers.IO) прямо в классе и никогда его не отменяют. Это та же утечка, что и с GlobalScope, только менее заметная.