Раздел 46 · Effect: Тихая Академия

Босс: сто соседей сразу

middle-senior~70 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Ночь из урока 46 шла одним муравьём: строка за строкой. Отчёт выходил правильным, потому что никто не мешал. Сегодня муравьёв много, и каждый кусок отчёта кто-нибудь трогает одновременно с кем-нибудь ещё. Задача раздела в одной фразе: работа вперемешку, результат как по порядку.

Что нужно башне

Тесты накопительные. Сверху одна вещь в src/hub.ts.

  • stormNight(lines, limit), ночь вперемешку. Строки разбираются все, мусор идёт в отчёт по тегу, как в decodeSplit из урока 63. Кадры обрабатываются одновременно, не больше limit сразу. Повтор узнаёт Seen из урока 65 одним шагом, поэтому второй экземпляр кадра не уходит в ответ, даже пока первый ещё ждёт провода. Каждый кадр проходит checkFrame и respond, и его исход башня разбирает, как в боссе EF4.
  • Отчёт тот же, что у processNight. Те же исходы, те же ошибки, те же призраки в том же порядке, те же дубли и сбои. На ночи из ста строк и с проводом, который отвечает с разной задержкой, порядок ответов каждый раз другой, а отчёт один.
  • Ошибок в типе нет, в R провод, книга и Seen.

Чек-лист перед сдачей

  1. Тесты всех живых прошлых этапов зелёные.
  2. Отчёт ночи из ста строк равен отчёту processNight на той же ночи, и набор отправленных строк тот же.
  3. В работе одновременно больше одного кадра, но не больше limit.
  4. Двадцать одинаковых кадров при limit = 100: ответ ушёл один, дублей девятнадцать.
  5. Призраки в отчёте в порядке строк, хотя проверялись вперемешку.

Башня, этап 35

Работа вперемешку, отчёт по порядку

Подумай до кода, где в ночи могут столкнуться два муравья.

  • Дубли. Два экземпляра кадра идут одновременно. Если «видел ли я его» и «запомнить» это два шага, оба увидят «нет». Нужен один шаг: Ref.modify.
  • Счёт. Сто муравьёв пишут в один отчёт. Можно класть его в Ref и обновлять update, а можно не делить отчёт вовсе: пусть каждый кадр отдаёт свою судьбу значением, forEach соберёт судьбы в порядке строк, а отчёт сложится обычным циклом после. Второй путь проще проверить: состояние общее только у Seen.
  • Предел. Ограничивает concurrency у forEach. Если провод общий для нескольких частей башни, предел ставят на провод, throttled из урока 67, но сегодня провод у ночи один.

Практика

Итог

Утром Рыдкулл кладёт рядом два отчёта: ночь по одному кадру и ночь вперемешку. Цифры совпадают до строки.

Пондер стоит у трубок Гекса. Муравьи бегут быстро, но больше никто не сталкивается лбами.

Дальше

Ночью на башне останавливаются часы. В дверь стучат: на пороге высокая сухая женщина с расписанием в руках и связкой ключей от часового механизма.

Следующий раздел курса это EF8 «Часы на башне»: расписания, повторы, таймауты и тестовые часы. Начинается он с урока 72.