JL Julia  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Задачи и каналы

Профессиональные сценарии по теме «Задачи и каналы» проверяют диагностику, производительность, безопасность и способность защитить архитектурное решение. Вопросы требуют читать код, находить границу применимости, выбирать проверяемую правку и отличать свойства Julia от поведения конкретного пакета. В тесте 30 вопросов: 18 заданий с кодом и 12 заданий с математической записью. Все формулировки рассчитаны на Julia 1.12.6; для сторонних библиотек используется явно названный API.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 30
Какой механизм Julia определяет поведение строки `@task begin`?
Task: s_0\to s_1\to\cdots
JuliaJulia · Задачи Task
function producer(n)
    @task begin
        s = 0
        for i in 1:n
            s += i
            iszero(i % 1000) && yield()
        end
        s
    end
end
t = producer(10_000)
schedule(t)
@show fetch(t)
Вопрос 2 из 30
Какой тест точнее всего зафиксирует границу поведения `@task begin`?
JuliaJulia · Задачи Task
function producer(n)
    @task begin
        s = 0
        for i in 1:n
            s += i
            iszero(i % 1000) && yield()
        end
        s
    end
end
t = producer(10_000)
schedule(t)
@show fetch(t)
Вопрос 3 из 30
Какой контракт следует закрепить при переработке строки `@task begin`?
JuliaJulia · Задачи Task
function producer(n)
    @task begin
        s = 0
        for i in 1:n
            s += i
            iszero(i % 1000) && yield()
        end
        s
    end
end
t = producer(10_000)
schedule(t)
@show fetch(t)
Вопрос 4 из 30
Как проверить, что новая реализация `@task begin` не изменила обещанное пользователю поведение?
Task: s_0\to s_1\to\cdots
Вопрос 5 из 30
Как сформулировать границу механизма `@task begin` без чрезмерного обещания?
Вопрос 6 из 30
Какое объяснение для `return Channel{Int}(capacity) do ch` выдержит проверку на другом допустимом входе?
0\le |Channel|\le capacity
JuliaJulia · Каналы Channel
function stream_values(n; capacity=2)
    return Channel{Int}(capacity) do ch
        for i in 1:n
            put!(ch, i^2)
        end
    end
end
@show collect(stream_values(5))
Вопрос 7 из 30
Какую проверку стоит добавить для участка с `return Channel{Int}(capacity) do ch`?
JuliaJulia · Каналы Channel
function stream_values(n; capacity=2)
    return Channel{Int}(capacity) do ch
        for i in 1:n
            put!(ch, i^2)
        end
    end
end
@show collect(stream_values(5))
Вопрос 8 из 30
Какую гарантию должна сохранить правка участка с `return Channel{Int}(capacity) do ch`?
JuliaJulia · Каналы Channel
function stream_values(n; capacity=2)
    return Channel{Int}(capacity) do ch
        for i in 1:n
            put!(ch, i^2)
        end
    end
end
@show collect(stream_values(5))
Вопрос 9 из 30
При переносе кода с `return Channel{Int}(capacity) do ch` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
0\le |Channel|\le capacity
Вопрос 10 из 30
Какое ограничение стоит прямо указать в документации к участку с `return Channel{Int}(capacity) do ch`?
Вопрос 11 из 30
Какое утверждение точнее всего объясняет участок с `left = @async begin sleep(0.01); 20 end`?
T=\max_i T_i+T_{sync}
JuliaJulia · Планирование
function load_pair()
    left = @async begin sleep(0.01); 20 end
    right = @async begin sleep(0.01); 22 end
    wait(left)
    wait(right)
    return fetch(left) + fetch(right)
end
@show load_pair()
Вопрос 12 из 30
Какую проверку стоит добавить для участка с `left = @async begin sleep(0.01); 20 end`?
JuliaJulia · Планирование
function load_pair()
    left = @async begin sleep(0.01); 20 end
    right = @async begin sleep(0.01); 22 end
    wait(left)
    wait(right)
    return fetch(left) + fetch(right)
end
@show load_pair()
Вопрос 13 из 30
Какое решение устраняет риск вокруг `left = @async begin sleep(0.01); 20 end`, не меняя поведение на допустимых данных?
JuliaJulia · Планирование
function load_pair()
    left = @async begin sleep(0.01); 20 end
    right = @async begin sleep(0.01); 22 end
    wait(left)
    wait(right)
    return fetch(left) + fetch(right)
end
@show load_pair()
Вопрос 14 из 30
При переносе кода с `left = @async begin sleep(0.01); 20 end` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
T=\max_i T_i+T_{sync}
Вопрос 15 из 30
Что следует сообщить пользователю библиотеки о поведении `left = @async begin sleep(0.01); 20 end`?
Вопрос 16 из 30
Какое утверждение точнее всего объясняет участок с `fetch(t)`?
fetch(t)\uparrow e
JuliaJulia · Обработка ошибок
function failing_task()
    @async begin
        sleep(0.01)
        error("worker failed")
    end
end
t = failing_task()
try
    fetch(t)
catch err
    @show typeof(err) err
end
Вопрос 17 из 30
Какую проверку стоит добавить для участка с `fetch(t)`?
JuliaJulia · Обработка ошибок
function failing_task()
    @async begin
        sleep(0.01)
        error("worker failed")
    end
end
t = failing_task()
try
    fetch(t)
catch err
    @show typeof(err) err
end
Вопрос 18 из 30
Какое требование к `fetch(t)` важнее удобной детали текущей реализации?
JuliaJulia · Обработка ошибок
function failing_task()
    @async begin
        sleep(0.01)
        error("worker failed")
    end
end
t = failing_task()
try
    fetch(t)
catch err
    @show typeof(err) err
end
Вопрос 19 из 30
Две реализации участка с `fetch(t)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
fetch(t)\uparrow e
Вопрос 20 из 30
Какой тезис о `fetch(t)` можно честно закрепить в справке?
Вопрос 21 из 30
Как нужно интерпретировать `input = Channel{Int}(2)`, не добавляя к коду лишних гарантий?
P(complete)=1\;\text{при корректном закрытии}
JuliaJulia · Проверка корректности
function pipeline(values)
    input = Channel{Int}(2)
    output = Channel{Int}(2)
    @sync begin
        @async begin
            foreach(x -> put!(input, x), values)
            close(input)
        end
        @async begin
            for x in input
                put!(output, x^2)
            end
            close(output)
        end
    end
    return collect(output)
end
@show pipeline(1:5)
Вопрос 22 из 30
Какую проверку стоит добавить для участка с `input = Channel{Int}(2)`?
JuliaJulia · Проверка корректности
function pipeline(values)
    input = Channel{Int}(2)
    output = Channel{Int}(2)
    @sync begin
        @async begin
            foreach(x -> put!(input, x), values)
            close(input)
        end
        @async begin
            for x in input
                put!(output, x^2)
            end
            close(output)
        end
    end
    return collect(output)
end
@show pipeline(1:5)
Вопрос 23 из 30
Какой контракт следует закрепить при переработке строки `input = Channel{Int}(2)`?
JuliaJulia · Проверка корректности
function pipeline(values)
    input = Channel{Int}(2)
    output = Channel{Int}(2)
    @sync begin
        @async begin
            foreach(x -> put!(input, x), values)
            close(input)
        end
        @async begin
            for x in input
                put!(output, x^2)
            end
            close(output)
        end
    end
    return collect(output)
end
@show pipeline(1:5)
Вопрос 24 из 30
Как проверить, что новая реализация `input = Channel{Int}(2)` не изменила обещанное пользователю поведение?
P(complete)=1\;\text{при корректном закрытии}
Вопрос 25 из 30
Какое утверждение о `input = Channel{Int}(2)` является переносимым правилом, а не особенностью одного запуска?
Вопрос 26 из 30
Как нужно интерпретировать `stop = Ref(false)`, не добавляя к коду лишних гарантий?
cancel\Rightarrow close\Rightarrow cleanup
JuliaJulia · Устойчивость к сбоям
function supervised(jobs)
    stop = Ref(false)
    errors = Channel{Any}(length(jobs))
    tasks = [@async try
        stop[] || job()
    catch err
        stop[] = true
        put!(errors, (err, catch_backtrace()))
    end for job in jobs]
    foreach(wait, tasks)
    close(errors)
    return collect(errors)
end
Вопрос 27 из 30
Какой тест точнее всего зафиксирует границу поведения `stop = Ref(false)`?
JuliaJulia · Устойчивость к сбоям
function supervised(jobs)
    stop = Ref(false)
    errors = Channel{Any}(length(jobs))
    tasks = [@async try
        stop[] || job()
    catch err
        stop[] = true
        put!(errors, (err, catch_backtrace()))
    end for job in jobs]
    foreach(wait, tasks)
    close(errors)
    return collect(errors)
end
Вопрос 28 из 30
Какой контракт следует закрепить при переработке строки `stop = Ref(false)`?
JuliaJulia · Устойчивость к сбоям
function supervised(jobs)
    stop = Ref(false)
    errors = Channel{Any}(length(jobs))
    tasks = [@async try
        stop[] || job()
    catch err
        stop[] = true
        put!(errors, (err, catch_backtrace()))
    end for job in jobs]
    foreach(wait, tasks)
    close(errors)
    return collect(errors)
end
Вопрос 29 из 30
Как проверить, что новая реализация `stop = Ref(false)` не изменила обещанное пользователю поведение?
cancel\Rightarrow close\Rightarrow cleanup
Вопрос 30 из 30
Что следует сообщить пользователю библиотеки о поведении `stop = Ref(false)`?

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

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

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

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