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

Асинхронная архитектура с корутинами

Тест по теме «Асинхронная архитектура с корутинами» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 30 вопросов, из них 18 содержат фрагменты Lua. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 85 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 30
Какой контракт языка проявляется в этом примере? Нужна именно центральная гарантия раздела «Планировщик».
LuaLua · Планировщик · разбор 1
local ready={}
local function spawn(fn) ready[#ready+1]=coroutine.create(fn) end
while #ready>0 do
  local co=table.remove(ready,1)
  local ok,reason=coroutine.resume(co)
  if not ok then report(reason) elseif coroutine.status(co)~="dead" then ready[#ready+1]=co end
end
Вопрос 2 из 30
Что следует изменить во входе, чтобы проверить скрытое ограничение? Нужен отрицательный сценарий для раздела «Планировщик».
LuaLua · Планировщик · разбор 2
local function reproduce_case()
  local ready={}
  local function spawn(fn) ready[#ready+1]=coroutine.create(fn) end
  while #ready>0 do
    local co=table.remove(ready,1)
    local ok,reason=coroutine.resume(co)
    if not ok then report(reason) elseif coroutine.status(co)~="dead" then ready[#ready+1]=co end
  end
end
reproduce_case()
Вопрос 3 из 30
Код переписывают без изменения внешнего поведения. Какой контракт должен сохраниться? Речь идёт о центральном правиле раздела «Планировщик».
LuaLua · Планировщик · разбор 3
do
  local ready={}
  local function spawn(fn) ready[#ready+1]=coroutine.create(fn) end
  while #ready>0 do
    local co=table.remove(ready,1)
    local ok,reason=coroutine.resume(co)
    if not ok then report(reason) elseif coroutine.status(co)~="dead" then ready[#ready+1]=co end
  end
end
Вопрос 4 из 30
В модуле меняют «Планировщик» и хотят сохранить диагностируемость. Какой подход надёжнее? Ответ должен выражать проверяемое следствие раздела «Планировщик».
Вопрос 5 из 30
Что помогает не переносить в раздел «Планировщик» привычки из другого языка или среды? Выберите описание, объединяющее механизм и границу раздела «Планировщик».
Вопрос 6 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Ответ должен описывать основной механизм раздела «Ожидание событий».
LuaLua · Ожидание событий · разбор 1
local waiting={}
local function await(key)
  waiting[key]=coroutine.running()
  return coroutine.yield("wait",key)
end
local function publish(key,value)
  local co=waiting[key]; waiting[key]=nil
  if co then schedule(co,value) end
end
Вопрос 7 из 30
Что не видно по одному успешному запуску этого кода? Выберите именно проверяемую границу раздела «Ожидание событий».
LuaLua · Ожидание событий · разбор 2
local function reproduce_case()
  local waiting={}
  local function await(key)
    waiting[key]=coroutine.running()
    return coroutine.yield("wait",key)
  end
  local function publish(key,value)
    local co=waiting[key]; waiting[key]=nil
    if co then schedule(co,value) end
  end
end
reproduce_case()
Вопрос 8 из 30
Какое правило должно остаться наблюдаемым после правки? Нужен основной контракт раздела «Ожидание событий».
LuaLua · Ожидание событий · разбор 3
do
  local waiting={}
  local function await(key)
    waiting[key]=coroutine.running()
    return coroutine.yield("wait",key)
  end
  local function publish(key,value)
    local co=waiting[key]; waiting[key]=nil
    if co then schedule(co,value) end
  end
end
Вопрос 9 из 30
В модуле меняют «Ожидание событий» и хотят сохранить диагностируемость. Какой подход надёжнее? Нужна эксплуатационная граница раздела «Ожидание событий».
Вопрос 10 из 30
Что помогает не переносить в раздел «Ожидание событий» привычки из другого языка или среды? Выберите описание, объединяющее механизм и границу раздела «Ожидание событий».
Вопрос 11 из 30
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Выберите основное правило раздела «Отмена».
LuaLua · Отмена · разбор 1
local task={state="running",cleanups={}}
function task:cancel()
  if self.state~="running" then return false end
  self.state="cancelled"
  for i=#self.cleanups,1,-1 do self.cleanups[i]() end
  return true
end
Вопрос 12 из 30
Какое последствие проявится только при другом входе или повторном вызове? Нужен отрицательный сценарий для раздела «Отмена».
LuaLua · Отмена · разбор 2
local function reproduce_case()
  local task={state="running",cleanups={}}
  function task:cancel()
    if self.state~="running" then return false end
    self.state="cancelled"
    for i=#self.cleanups,1,-1 do self.cleanups[i]() end
    return true
  end
end
reproduce_case()
Вопрос 13 из 30
Какой результат обязан подтверждать регрессионный тест после правки? Выберите гарантию, определяющую раздел «Отмена».
LuaLua · Отмена · разбор 3
do
  local task={state="running",cleanups={}}
  function task:cancel()
    if self.state~="running" then return false end
    self.state="cancelled"
    for i=#self.cleanups,1,-1 do self.cleanups[i]() end
    return true
  end
end
Вопрос 14 из 30
После редкого сбоя команда спорит о разделе «Отмена». Какой вывод должен попасть в код и тесты? Нужна эксплуатационная граница раздела «Отмена».
Вопрос 15 из 30
Какое утверждение о разделе «Отмена» наиболее полное и точное? Ответ должен охватывать весь раздел «Отмена».
Вопрос 16 из 30
На каком правиле держится поведение этого кода? Выберите основное правило раздела «Распространение ошибок».
LuaLua · Распространение ошибок · разбор 1
local ok,value=coroutine.resume(task.co,event)
if not ok then
  task.state="failed"
  task.error=debug.traceback(task.co,tostring(value))
  reject_dependents(task)
end
Вопрос 17 из 30
Какую границу стоит сделать явной в регрессионной проверке? Нужен отрицательный сценарий для раздела «Распространение ошибок».
LuaLua · Распространение ошибок · разбор 2
local function reproduce_case()
  local ok,value=coroutine.resume(task.co,event)
  if not ok then
    task.state="failed"
    task.error=debug.traceback(task.co,tostring(value))
    reject_dependents(task)
  end
end
reproduce_case()
Вопрос 18 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Речь идёт о центральном правиле раздела «Распространение ошибок».
LuaLua · Распространение ошибок · разбор 3
do
  local ok,value=coroutine.resume(task.co,event)
  if not ok then
    task.state="failed"
    task.error=debug.traceback(task.co,tostring(value))
    reject_dependents(task)
  end
end
Вопрос 19 из 30
Команда меняет раздел «Распространение ошибок» в рабочем модуле. На какое решение можно опереться при повторном запуске и отказе зависимости? Ответ должен выражать проверяемое следствие раздела «Распространение ошибок».
Вопрос 20 из 30
Какое правило лучше всего описывает границы раздела «Распространение ошибок»? Выберите описание, объединяющее механизм и границу раздела «Распространение ошибок».
Вопрос 21 из 30
В чём ключ к разбору строки «local co=coroutine.create(assert(load(task.source,"task","t",env)))»? Нужна именно центральная гарантия раздела «Риски безопасности».
LuaLua · Риски безопасности · разбор 1
local env=sandbox_for(task.owner)
local co=coroutine.create(assert(load(task.source,"task","t",env)))
register_limits(co,task.owner)
schedule(co)
Вопрос 22 из 30
Какой риск останется незамеченным, если выполнить код только один раз? Выберите именно проверяемую границу раздела «Риски безопасности».
LuaLua · Риски безопасности · разбор 2
local function reproduce_case()
  local env=sandbox_for(task.owner)
  local co=coroutine.create(assert(load(task.source,"task","t",env)))
  register_limits(co,task.owner)
  schedule(co)
end
reproduce_case()
Вопрос 23 из 30
Какой инвариант нельзя потерять при упрощении этого фрагмента? Речь идёт о центральном правиле раздела «Риски безопасности».
LuaLua · Риски безопасности · разбор 3
do
  local env=sandbox_for(task.owner)
  local co=coroutine.create(assert(load(task.source,"task","t",env)))
  register_limits(co,task.owner)
  schedule(co)
end
Вопрос 24 из 30
Нужно сделать поведение «Риски безопасности» предсказуемым для следующего разработчика. Что выбрать? Выберите практическое следствие раздела «Риски безопасности».
Вопрос 25 из 30
Какое утверждение о разделе «Риски безопасности» точно и не обещает лишнего? Нужна полная формулировка раздела «Риски безопасности».
Вопрос 26 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Нужна именно центральная гарантия раздела «Контроль производительности».
LuaLua · Контроль производительности · разбор 1
metrics.gauge("scheduler_ready",#ready)
metrics.gauge("scheduler_waiting",count(waiting))
metrics.observe("scheduler_resume_ms",resume_elapsed)
if work_units>budget then reschedule(co) end
Вопрос 27 из 30
Какой отказ должен быть воспроизводимым в тесте? Выберите именно проверяемую границу раздела «Контроль производительности».
LuaLua · Контроль производительности · разбор 2
local function reproduce_case()
  metrics.gauge("scheduler_ready",#ready)
  metrics.gauge("scheduler_waiting",count(waiting))
  metrics.observe("scheduler_resume_ms",resume_elapsed)
  if work_units>budget then reschedule(co) end
end
reproduce_case()
Вопрос 28 из 30
Какой смысл фрагмента нельзя спрятать в комментарии вместо проверки? Выберите гарантию, определяющую раздел «Контроль производительности».
LuaLua · Контроль производительности · разбор 3
do
  metrics.gauge("scheduler_ready",#ready)
  metrics.gauge("scheduler_waiting",count(waiting))
  metrics.observe("scheduler_resume_ms",resume_elapsed)
  if work_units>budget then reschedule(co) end
end
Вопрос 29 из 30
В модуле меняют «Контроль производительности» и хотят сохранить диагностируемость. Какой подход надёжнее? Ответ должен выражать проверяемое следствие раздела «Контроль производительности».
Вопрос 30 из 30
Что нельзя вывести из одного удачного примера, но нужно знать о разделе «Контроль производительности»? Ответ должен охватывать весь раздел «Контроль производительности».

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

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

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

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