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

Диспетчеры и контексты корутин

Здесь важно выбрать контекст по характеру работы, а не по привычке: вычисления, блокирующий ввод-вывод, ограниченный ресурс или главный поток. Вопросы проверяют withContext, наследование элементов контекста и последствия блокировки диспетчера.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Для «Результат withContext» предлагают правку: Обернуть только реально блокирующий или CPU-участок, не прыгать между dispatchers вокруг каждой мелкой операции. Какой компромисс нельзя пропустить?
Вопрос 2 из 25
Почему `withContext(Dispatchers.IO)` здесь уместнее одного `suspend`?
KotlinБлокирующий код · Legacy-блокировка в IO
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

suspend fun legacyCall(): String = withContext(Dispatchers.IO) {
    Thread.sleep(50)
    "ok"
}
Вопрос 3 из 25
Какой принцип лежит в основе поведения «Инъекция CoroutineDispatcher»?
KotlinТестирование и инструменты · Инъекция CoroutineDispatcher
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
class Repository(private val io: CoroutineDispatcher) {
    suspend fun load() = withContext(io) { "data" }
}
Вопрос 4 из 25
Какую точечную правку стоит принять на ревью фрагмента «Контекст Dispatchers.Default»?
KotlinДиспетчеры корутин · Контекст Dispatchers.Default
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val name = withContext(Dispatchers.Default) { Thread.currentThread().name }
    println(name.isNotBlank())
}
Вопрос 5 из 25
Что добавить в регрессионный набор для «Замещение элемента CoroutineContext»?
Вопрос 6 из 25
Почему пример «Legacy-блокировка в IO» даёт именно такой результат?
KotlinБлокирующий код · Legacy-блокировка в IO
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

suspend fun legacyCall(): String = withContext(Dispatchers.IO) {
    Thread.sleep(50)
    "ok"
}
Вопрос 7 из 25
Какой рефакторинг делает поведение «Инъекция CoroutineDispatcher» предсказуемее?
KotlinТестирование и инструменты · Инъекция CoroutineDispatcher
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
class Repository(private val io: CoroutineDispatcher) {
    suspend fun load() = withContext(io) { "data" }
}
Вопрос 8 из 25
Какой сценарий выявит скрытое ограничение «Контекст Dispatchers.Default»?
Вопрос 9 из 25
Какую обратную сторону имеет решение для «Замещение элемента CoroutineContext»: Передавать диагностические идентификаторы через CoroutineName или собственный элемент контекста, не через ThreadLocal без адаптера?
Вопрос 10 из 25
Какой результат вернёт `compute`?
KotlinПереключение через withContext · Результат withContext
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

suspend fun compute(): Int = withContext(Dispatchers.Default) {
    (1..100).sum()
}
fun main() = runBlocking { println(compute()) }
Вопрос 11 из 25
Что добавить в регрессионный набор для «Инъекция CoroutineDispatcher»?
Вопрос 12 из 25
Команда собирается выбирать dispatcher по характеру работы и внедрять его в код, где тестам нужен контроль контекста. Что придётся учитывать после внедрения в «Контекст Dispatchers.Default»?
Вопрос 13 из 25
Какое имя будет напечатано?
KotlinКонтекст корутины · Замещение элемента CoroutineContext
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking(CoroutineName("root")) {
    launch(CoroutineName("child")) {
        println(coroutineContext[CoroutineName]?.name)
    }.join()
}
Вопрос 14 из 25
Какое объяснение результата «Результат withContext» выдерживает проверку соседними случаями?
KotlinПереключение через withContext · Результат withContext
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

suspend fun compute(): Int = withContext(Dispatchers.Default) {
    (1..100).sum()
}
fun main() = runBlocking { println(compute()) }
Вопрос 15 из 25
Какая небольшая правка заметно повышает надёжность «Legacy-блокировка в IO»?
KotlinБлокирующий код · Legacy-блокировка в IO
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

suspend fun legacyCall(): String = withContext(Dispatchers.IO) {
    Thread.sleep(50)
    "ok"
}
Вопрос 16 из 25
Что гарантирует этот код?
KotlinДиспетчеры корутин · Контекст Dispatchers.Default
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val name = withContext(Dispatchers.Default) { Thread.currentThread().name }
    println(name.isNotBlank())
}
Вопрос 17 из 25
Что точнее описывает механику фрагмента «Замещение элемента CoroutineContext»?
KotlinКонтекст корутины · Замещение элемента CoroutineContext
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking(CoroutineName("root")) {
    launch(CoroutineName("child")) {
        println(coroutineContext[CoroutineName]?.name)
    }.join()
}
Вопрос 18 из 25
Что стоит исправить в «Результат withContext» перед слиянием?
KotlinПереключение через withContext · Результат withContext
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

suspend fun compute(): Int = withContext(Dispatchers.Default) {
    (1..100).sum()
}
fun main() = runBlocking { println(compute()) }
Вопрос 19 из 25
Что добавить в регрессионный набор для «Legacy-блокировка в IO»?
Вопрос 20 из 25
Предложенная правка для «Инъекция CoroutineDispatcher» звучит так: Использовать общий TestCoroutineScheduler для связанных диспетчеров и проверять завершение через `advanceUntilIdle` только там, где задача действительно отложена. Какой недостаток важнее обсудить?
Вопрос 21 из 25
Что следует изменить прежде всего во фрагменте «Замещение элемента CoroutineContext»?
KotlinКонтекст корутины · Замещение элемента CoroutineContext
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking(CoroutineName("root")) {
    launch(CoroutineName("child")) {
        println(coroutineContext[CoroutineName]?.name)
    }.join()
}
Вопрос 22 из 25
Какой тест лучше всего защищает край контракта «Результат withContext»?
Вопрос 23 из 25
Какова практическая цена решения «Legacy-блокировка в IO»: По возможности использовать неблокирующий клиент, а неизбежный legacy-вызов локально изолировать в IO и ограничить параллелизм?
Вопрос 24 из 25
Зачем dispatcher передан в конструктор?
KotlinТестирование и инструменты · Инъекция CoroutineDispatcher
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
class Repository(private val io: CoroutineDispatcher) {
    suspend fun load() = withContext(io) { "data" }
}
Вопрос 25 из 25
Какой принцип лежит в основе поведения «Контекст Dispatchers.Default»?
KotlinДиспетчеры корутин · Контекст Dispatchers.Default
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val name = withContext(Dispatchers.Default) { Thread.currentThread().name }
    println(name.isNotBlank())
}

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

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

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

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