Определение параллельного и последовательного исполнения

После исправления синтаксиса 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 их не ускорят.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее