💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 2 из 30
Какой тест точнее всего зафиксирует границу поведения `@task begin`?
Julia Julia · Задачи 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)
Проверить на отдельном примере, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Проверить на отдельном примере, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Проверить на отдельном примере, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Проверить на отдельном примере, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Вопрос 4 из 30
Как проверить, что новая реализация `@task begin` не изменила обещанное пользователю поведение?
Task: s_0\to s_1\to\cdots
Приёмка должна подтвердить, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Приёмка должна подтвердить, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Приёмка должна подтвердить, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Приёмка должна подтвердить, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Вопрос 7 из 30
Какую проверку стоит добавить для участка с `return Channel{Int}(capacity) do ch`?
Julia Julia · Каналы 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))
Проверить на отдельном примере, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Проверить на отдельном примере, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Проверить на отдельном примере, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Проверить на отдельном примере, что неограниченный Channel создаёт обратное давление, когда потребитель отстаёт, и тем самым ограничивает память.
Вопрос 9 из 30
При переносе кода с `return Channel{Int}(capacity) do ch` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
0\le |Channel|\le capacity
Приёмка должна подтвердить, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Приёмка должна подтвердить, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Приёмка должна подтвердить, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Приёмка должна подтвердить, что неограниченный Channel создаёт обратное давление, когда потребитель отстаёт, и тем самым ограничивает память.
Вопрос 11 из 30
Какое утверждение точнее всего объясняет участок с `left = @async begin sleep(0.01); 20 end`?
T=\max_i T_i+T_{sync}
Julia Julia · Планирование Копировать
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()
Задачи, созданные через @async, выполняются в порядке создания, поэтому блокирующие участки и справедливость планирования можно отдельно не проверять.
Устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Вопрос 12 из 30
Какую проверку стоит добавить для участка с `left = @async begin sleep(0.01); 20 end`?
Julia Julia · Планирование Копировать
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()
Проверить на отдельном примере, что ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Проверить на отдельном примере, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Проверить на отдельном примере, что задачи, созданные через @async, выполняются в порядке создания, поэтому блокирующие участки и справедливость планирования можно отдельно не проверять.
Проверить на отдельном примере, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Вопрос 13 из 30
Какое решение устраняет риск вокруг `left = @async begin sleep(0.01); 20 end`, не меняя поведение на допустимых данных?
Julia Julia · Планирование Копировать
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()
Сохранить в реализации правило: Ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Сохранить в реализации правило: Планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Сохранить в реализации правило: Задачи, созданные через @async, выполняются в порядке создания, поэтому блокирующие участки и справедливость планирования можно отдельно не проверять.
Сохранить в реализации правило: Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Сохранить в реализации правило: Устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Вопрос 14 из 30
При переносе кода с `left = @async begin sleep(0.01); 20 end` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
T=\max_i T_i+T_{sync}
Приёмка должна подтвердить, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Приёмка должна подтвердить, что задачи, созданные через @async, выполняются в порядке создания, поэтому блокирующие участки и справедливость планирования можно отдельно не проверять.
Приёмка должна подтвердить, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Приёмка должна подтвердить, что ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Вопрос 15 из 30
Что следует сообщить пользователю библиотеки о поведении `left = @async begin sleep(0.01); 20 end`?
Указать в документации: Задачи, созданные через @async, выполняются в порядке создания, поэтому блокирующие участки и справедливость планирования можно отдельно не проверять.
Указать в документации: Планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Указать в документации: Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Указать в документации: Устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Указать в документации: Ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Вопрос 17 из 30
Какую проверку стоит добавить для участка с `fetch(t)`?
Julia Julia · Обработка ошибок Копировать
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
Проверить на отдельном примере, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Проверить на отдельном примере, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Проверить на отдельном примере, что ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Проверить на отдельном примере, что исключение из задачи всплывает в месте её создания, поэтому отдельный `wait` или `fetch` нужен лишь для получения результата.
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Вопрос 19 из 30
Две реализации участка с `fetch(t)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
fetch(t)\uparrow e
Приёмка должна подтвердить, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Приёмка должна подтвердить, что исключение из задачи всплывает в месте её создания, поэтому отдельный `wait` или `fetch` нужен лишь для получения результата.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Приёмка должна подтвердить, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Приёмка должна подтвердить, что ошибка задачи становится видимой через `wait` или `fetch` и составные исключения; запись текста в журнал без завершения зависимых задач оставляет систему в неверном состоянии.
Вопрос 21 из 30
Как нужно интерпретировать `input = Channel{Int}(2)`, не добавляя к коду лишних гарантий?
P(complete)=1\;\text{при корректном закрытии}
Julia Julia · Проверка корректности Копировать
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)
Созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
`Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
`Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Если конкурентный конвейер однажды выдал правильный итоговый список, его завершение, обратное давление и поведение при раннем закрытии уже подтверждены.
Вопрос 22 из 30
Какую проверку стоит добавить для участка с `input = Channel{Int}(2)`?
Julia Julia · Проверка корректности Копировать
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)
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Проверить на отдельном примере, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Проверить на отдельном примере, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Проверить на отдельном примере, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Проверить на отдельном примере, что если конкурентный конвейер однажды выдал правильный итоговый список, его завершение, обратное давление и поведение при раннем закрытии уже подтверждены.
Вопрос 24 из 30
Как проверить, что новая реализация `input = Channel{Int}(2)` не изменила обещанное пользователю поведение?
P(complete)=1\;\text{при корректном закрытии}
Приёмка должна подтвердить, что если конкурентный конвейер однажды выдал правильный итоговый список, его завершение, обратное давление и поведение при раннем закрытии уже подтверждены.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Приёмка должна подтвердить, что созданная через `@async` задача получает собственный системный поток, поэтому длинный вычислительный цикл не задерживает соседние задачи.
Приёмка должна подтвердить, что `Channel{T}` задаёт тип сообщений и может создавать обратное давление ограниченной ёмкостью; закрытие и исчерпание канала — разные состояния.
Приёмка должна подтвердить, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Вопрос 26 из 30
Как нужно интерпретировать `stop = Ref(false)`, не добавляя к коду лишних гарантий?
cancel\Rightarrow close\Rightarrow cleanup
Julia Julia · Устойчивость к сбоям Копировать
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
Закрытие входного канала немедленно закрывает все выходные каналы и отменяет зависимые задачи без отдельного протокола.
Планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
`Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Вопрос 27 из 30
Какой тест точнее всего зафиксирует границу поведения `stop = Ref(false)`?
Julia Julia · Устойчивость к сбоям Копировать
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
Проверить на отдельном примере, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Проверить на отдельном примере, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Проверить на отдельном примере, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Проверить на отдельном примере, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Проверить на отдельном примере, что закрытие входного канала немедленно закрывает все выходные каналы и отменяет зависимые задачи без отдельного протокола.
Вопрос 28 из 30
Какой контракт следует закрепить при переработке строки `stop = Ref(false)`?
Julia Julia · Устойчивость к сбоям Копировать
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
Сохранить в реализации правило: Планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Сохранить в реализации правило: Закрытие входного канала немедленно закрывает все выходные каналы и отменяет зависимые задачи без отдельного протокола.
Сохранить в реализации правило: `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Сохранить в реализации правило: Устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.
Сохранить в реализации правило: Корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Вопрос 29 из 30
Как проверить, что новая реализация `stop = Ref(false)` не изменила обещанное пользователю поведение?
cancel\Rightarrow close\Rightarrow cleanup
Приёмка должна подтвердить, что планирование через `@async`, `@sync`, `schedule`, `wait` и `fetch` определяет время ожидания и распространение ошибок; запущенная задача без владельца легко теряет сбой.
Приёмка должна подтвердить, что корректность конкурентного конвейера проверяют на завершение, порядок там, где он обещан, обратное давление и отсутствие зависания при раннем закрытии.
Приёмка должна подтвердить, что `Task` выполняется кооперативно в рамках планировщика и переключается в точках ожидания; тяжёлый цикл без yield может задерживать другие задачи.
Приёмка должна подтвердить, что закрытие входного канала немедленно закрывает все выходные каналы и отменяет зависимые задачи без отдельного протокола.
Приёмка должна подтвердить, что устойчивость требует протокола отмены, закрытия каналов и идемпотентной очистки; принудительное завершение без координации может потерять сообщение или ресурс.