KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Корутины: основы

Основы корутин проверяются через жизненный цикл Job, области запуска и структурированную конкурентность. Придётся определить, чего действительно ждёт родитель, кто отменяет дочернюю задачу и почему suspend-функция сама по себе не создаёт параллельность.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Какой рефакторинг делает поведение «Дочерние async в coroutineScope» предсказуемее?
KotlinОбласть корутин · Дочерние async в coroutineScope
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

suspend fun load(): List<Int> = coroutineScope {
    val a = async { delay(20); 1 }
    val b = async { delay(10); 2 }
    listOf(a.await(), b.await())
}
Вопрос 2 из 25
Какой тест лучше всего защищает край контракта «Отмена и ожидание Job»?
Вопрос 3 из 25
Команда собирается использовать supervisor только когда частичная независимость является предметным требованием и ошибки каждого ребёнка обрабатываются отдельно. Что придётся учитывать после внедрения в «Сбой одного ребёнка»?
Вопрос 4 из 25
Как тестировать такую функцию без реальных задержек и сети?
KotlinТестирование и инструменты · Детерминированный тест suspend-функции
// Проследите фактическое выполнение без изменения кода.
suspend fun retry(load: suspend () -> String): String {
    repeat(2) { runCatching { return load() } }
    return load()
}
Вопрос 5 из 25
Какое утверждение точнее всего объясняет поведение фрагмента «Приостановка без нового потока»?
KotlinПриостанавливаемые функции · Приостановка без нового потока
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

suspend fun answer(): Int { delay(10); return 42 }
fun main() = runBlocking { println(answer()) }
Вопрос 6 из 25
Что может усложниться в сопровождении после изменения «Отмена и ожидание Job»: Хранить Job только там, где владелец обязан отменять конкретную операцию, и предпочитать отмену родительского scope для группы работ?
Вопрос 7 из 25
Что произойдёт после ошибки `left`?
KotlinСтруктурированная конкурентность · Сбой одного ребёнка
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

suspend fun pair(): Pair<Int, Int> = coroutineScope {
    val left = async { delay(10); error("boom") }
    val right = async { try { delay(1000); 2 } finally { println("cleanup") } }
    left.await() to right.await()
}
Вопрос 8 из 25
Какой принцип лежит в основе поведения «Детерминированный тест suspend-функции»?
KotlinТестирование и инструменты · Детерминированный тест suspend-функции
// На ревью требуется объяснить причину поведения.
suspend fun retry(load: suspend () -> String): String {
    repeat(2) { runCatching { return load() } }
    return load()
}
Вопрос 9 из 25
Какую правку выбрать, чтобы сохранить назначение «Приостановка без нового потока» и убрать хрупкость?
KotlinПриостанавливаемые функции · Приостановка без нового потока
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

suspend fun answer(): Int { delay(10); return 42 }
fun main() = runBlocking { println(answer()) }
Вопрос 10 из 25
Где упрощённое объяснение «Дочерние async в coroutineScope» перестаёт работать?
Вопрос 11 из 25
Почему пример «Сбой одного ребёнка» даёт именно такой результат?
KotlinСтруктурированная конкурентность · Сбой одного ребёнка
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

suspend fun pair(): Pair<Int, Int> = coroutineScope {
    val left = async { delay(10); error("boom") }
    val right = async { try { delay(1000); 2 } finally { println("cleanup") } }
    left.await() to right.await()
}
Вопрос 12 из 25
Какая небольшая правка заметно повышает надёжность «Детерминированный тест suspend-функции»?
KotlinТестирование и инструменты · Детерминированный тест suspend-функции
// Сохраните назначение фрагмента, но укрепите его контракт.
suspend fun retry(load: suspend () -> String): String {
    repeat(2) { runCatching { return load() } }
    return load()
}
Вопрос 13 из 25
Где упрощённое объяснение «Приостановка без нового потока» перестаёт работать?
Вопрос 14 из 25
Для «Дочерние async в coroutineScope» предлагают правку: Создавать дочерние задачи в scope операции, не передавая наружу Job, который переживёт владельца без явного контракта. Какой компромисс нельзя пропустить?
Вопрос 15 из 25
Какие строки ожидаются?
KotlinЖизненный цикл Job · Отмена и ожидание Job
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch { delay(100); println("done") }
    job.cancelAndJoin()
    println(job.isCancelled)
}
Вопрос 16 из 25
Что добавить в регрессионный набор для «Детерминированный тест suspend-функции»?
Вопрос 17 из 25
Для «Приостановка без нового потока» предлагают правку: Вызывать suspend-операции из управляемого scope и не скрывать блокирующий ввод-вывод под одним лишь опорным словом. Какой компромисс нельзя пропустить?
Вопрос 18 из 25
Когда завершится `load`?
KotlinОбласть корутин · Дочерние async в coroutineScope
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

suspend fun load(): List<Int> = coroutineScope {
    val a = async { delay(20); 1 }
    val b = async { delay(10); 2 }
    listOf(a.await(), b.await())
}
Вопрос 19 из 25
Какое утверждение точнее всего объясняет поведение фрагмента «Отмена и ожидание Job»?
KotlinЖизненный цикл Job · Отмена и ожидание Job
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch { delay(100); println("done") }
    job.cancelAndJoin()
    println(job.isCancelled)
}
Вопрос 20 из 25
Какая небольшая правка заметно повышает надёжность «Сбой одного ребёнка»?
KotlinСтруктурированная конкурентность · Сбой одного ребёнка
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

suspend fun pair(): Pair<Int, Int> = coroutineScope {
    val left = async { delay(10); error("boom") }
    val right = async { try { delay(1000); 2 } finally { println("cleanup") } }
    left.await() to right.await()
}
Вопрос 21 из 25
Что означает `suspend` в этом примере?
KotlinПриостанавливаемые функции · Приостановка без нового потока
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

suspend fun answer(): Int { delay(10); return 42 }
fun main() = runBlocking { println(answer()) }
Вопрос 22 из 25
На какой контракт языка или библиотеки опирается «Дочерние async в coroutineScope»?
KotlinОбласть корутин · Дочерние async в coroutineScope
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

suspend fun load(): List<Int> = coroutineScope {
    val a = async { delay(20); 1 }
    val b = async { delay(10); 2 }
    listOf(a.await(), b.await())
}
Вопрос 23 из 25
Как укрепить «Отмена и ожидание Job», не переписывая соседние модули?
KotlinЖизненный цикл Job · Отмена и ожидание Job
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch { delay(100); println("done") }
    job.cancelAndJoin()
    println(job.isCancelled)
}
Вопрос 24 из 25
Что добавить в регрессионный набор для «Сбой одного ребёнка»?
Вопрос 25 из 25
Предложенная правка для «Детерминированный тест suspend-функции» звучит так: Сделать политику повторов отдельной зависимостью, не ловить CancellationException и добавить сценарии успеха с первой/второй попытки и полного отказа. Какой недостаток важнее обсудить?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу