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

Каналы

Практический разбор каналов корутин: ёмкость буфера, приостановка отправителя, выбор через select и корректное завершение производителя. Важно учитывать планировщик и не приписывать программе порядок событий, которого код не гарантирует.

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

fun main() = runBlocking {
    val ch = Channel<Int>()
    launch { ch.send(1); ch.send(2); ch.close() }
    for (x in ch) print(x)
}
Вопрос 2 из 25
Какое правило нужно применить, чтобы объяснить «Первое значение в буфере»?
KotlinБуфер канала · Первое значение в буфере
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val ch = Channel<Int>(capacity = 1)
    ch.send(1)
    println("sent")
    println(ch.receive())
    ch.close()
}
Вопрос 3 из 25
Как превратить неявное предположение в проверяемый контракт «Ожидание первого канала»?
KotlinВыбор через select · Ожидание первого канала
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*

suspend fun first(a: ReceiveChannel<Int>, b: ReceiveChannel<Int>) = select<Int> {
    a.onReceive { it }
    b.onReceive { it }
}
Вопрос 4 из 25
Какой соседний случай отличает устойчивое решение «Автоматическое закрытие produce» от удачного примера?
Вопрос 5 из 25
Предложенная правка для «Тест завершения consumer» звучит так: Использовать ограниченный test scope, явно закрывать producer и после проверки убеждаться, что дочерние корутины завершены. Какой недостаток важнее обсудить?
Вопрос 6 из 25
Какое изменение лучше всего защищает границу «Первое значение в буфере»?
KotlinБуфер канала · Первое значение в буфере
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val ch = Channel<Int>(capacity = 1)
    ch.send(1)
    println("sent")
    println(ch.receive())
    ch.close()
}
Вопрос 7 из 25
На каком входе или состоянии граница «Ожидание первого канала» становится заметной?
Вопрос 8 из 25
Какое ограничение сохранится после правки «Автоматическое закрытие produce»: Не закрывать канал со стороны нескольких потребителей и обеспечить отмену producer, когда результат больше никому не нужен?
Вопрос 9 из 25
Какой тест проверяет и данные, и завершение?
KotlinТестирование и инструменты · Тест завершения consumer
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.channels.*
suspend fun drain(ch: ReceiveChannel<Int>): Int {
    var sum = 0
    for (x in ch) sum += x
    return sum
}
Вопрос 10 из 25
Почему пример «Получение до закрытия Channel» даёт именно такой результат?
KotlinКаналы · Получение до закрытия Channel
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val ch = Channel<Int>()
    launch { ch.send(1); ch.send(2); ch.close() }
    for (x in ch) print(x)
}
Вопрос 11 из 25
Какое ограничение сохранится после правки «Ожидание первого канала»: Документировать политику при одновременной готовности и обрабатывать закрытие через подходящие clause, а не считать его обычным значением?
Вопрос 12 из 25
Что произойдёт после трёх значений?
KotlinЗавершение производителя · Автоматическое закрытие produce
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

@OptIn(ExperimentalCoroutinesApi::class)
fun CoroutineScope.values() = produce<Int> {
    try { repeat(3) { send(it) } }
    finally { println("producer closed") }
}
fun main() = runBlocking {
    values().consumeEach { print(it) }
}
Вопрос 13 из 25
Что в семантике Kotlin или используемого API объясняет «Тест завершения consumer»?
KotlinТестирование и инструменты · Тест завершения consumer
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.channels.*
suspend fun drain(ch: ReceiveChannel<Int>): Int {
    var sum = 0
    for (x in ch) sum += x
    return sum
}
Вопрос 14 из 25
Что изменить в «Получение до закрытия Channel», чтобы скрытое допущение стало явным контрактом?
KotlinКаналы · Получение до закрытия Channel
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val ch = Channel<Int>()
    launch { ch.send(1); ch.send(2); ch.close() }
    for (x in ch) print(x)
}
Вопрос 15 из 25
Какой редкий случай способен сломать наивную трактовку «Первое значение в буфере»?
Вопрос 16 из 25
Какое правило нужно применить, чтобы объяснить «Автоматическое закрытие produce»?
KotlinЗавершение производителя · Автоматическое закрытие produce
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

@OptIn(ExperimentalCoroutinesApi::class)
fun CoroutineScope.values() = produce<Int> {
    try { repeat(3) { send(it) } }
    finally { println("producer closed") }
}
fun main() = runBlocking {
    values().consumeEach { print(it) }
}
Вопрос 17 из 25
Какая правка устраняет причину риска в «Тест завершения consumer», а не только его проявление?
KotlinТестирование и инструменты · Тест завершения consumer
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.channels.*
suspend fun drain(ch: ReceiveChannel<Int>): Int {
    var sum = 0
    for (x in ch) sum += x
    return sum
}
Вопрос 18 из 25
Какой пограничный сценарий обязательно добавить к проверкам «Получение до закрытия Channel»?
Вопрос 19 из 25
В «Первое значение в буфере» выбрали решение: Выбирать размер из модели нагрузки и измерений; не использовать огромный буфер как замену backpressure. Какова его реальная цена?
Вопрос 20 из 25
Какой контракт у функции `first`?
KotlinВыбор через select · Ожидание первого канала
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*

suspend fun first(a: ReceiveChannel<Int>, b: ReceiveChannel<Int>) = select<Int> {
    a.onReceive { it }
    b.onReceive { it }
}
Вопрос 21 из 25
Какой дополнительный сценарий нужен для «Тест завершения consumer»?
Вопрос 22 из 25
В «Получение до закрытия Channel» выбрали решение: Закрывать канал на стороне производителя и предпочитать `produce`/`channelFlow`, когда жизненный цикл можно связать со scope. Какова его реальная цена?
Вопрос 23 из 25
Почему `sent` появляется до receive?
KotlinБуфер канала · Первое значение в буфере
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val ch = Channel<Int>(capacity = 1)
    ch.send(1)
    println("sent")
    println(ch.receive())
    ch.close()
}
Вопрос 24 из 25
Почему пример «Ожидание первого канала» даёт именно такой результат?
KotlinВыбор через select · Ожидание первого канала
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*

suspend fun first(a: ReceiveChannel<Int>, b: ReceiveChannel<Int>) = select<Int> {
    a.onReceive { it }
    b.onReceive { it }
}
Вопрос 25 из 25
Как сделать ответственность во фрагменте «Автоматическое закрытие produce» понятной следующему разработчику?
KotlinЗавершение производителя · Автоматическое закрытие produce
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

@OptIn(ExperimentalCoroutinesApi::class)
fun CoroutineScope.values() = produce<Int> {
    try { repeat(3) { send(it) } }
    finally { println("producer closed") }
}
fun main() = runBlocking {
    values().consumeEach { print(it) }
}

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

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

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

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