После исправления синтаксиса sum выполняет операции последовательно из-за немедленного await, а sum2 запускает обе до ожидания результатов.
Определение параллельного и последовательного исполнения
После исправления синтаксиса sum выполняет операции последовательно из-за немедленного await, а sum2 запускает обе до ожидания результатов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Даны две функции, которые вызывают suspend‑функцию. Нужно выяснить, в какой из них вызовы происходят одновременно, а в какой – один за другим.
fun sum(): Int {
val first = async { suspendFun() }.await()
val second = async { suspendFun() }.await()
return first + second
}
fun sum2(): Int {
val first = async { suspendFun() }
val second = async { suspendFun() }
return first.await() + second.await()
}
fun suspendFun(): Int {
longBackgroundWork()
}
Ответ
После исправления синтаксиса sum выполняет операции последовательно из-за немедленного await, а sum2 запускает обе до ожидания результатов.
В исходнике async вызван без CoroutineScope, функции sum/sum2 не suspend, а suspendFun не возвращает Int и не помечена suspend. Рабочая структура с уже реализованной suspend-функцией:
suspend fun sum(): Int = coroutineScope {
val first = suspendFun()
val second = suspendFun()
first + second
}
suspend fun sum2(): Int = coroutineScope {
val first = async { suspendFun() }
val second = async { suspendFun() }
first.await() + second.await()
}
Нужны импорты async и coroutineScope. Во втором случае операции конкурентны; настоящее одновременное выполнение CPU-кода требует подходящего многопоточного dispatcher. Если обе операции блокируют единственный поток, сами по себе async их не ускорят.