Выбор ответа Middle Паттерны конкурентности спрашивают часто обновлено

Закрытие выходного канала в fan-in

Вопрос

В функции merge несколько горутин копируют свои входы в общий out. Где правильно вызвать close(out)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В отдельной горутине после wg.Wait() по всем копирующим. Закрыть можно только когда все писатели закончили.

Варианты ответа

  1. В отдельной горутине после wg.Wait() по всем копирующимправильный ответ
  2. В каждой копирующей горутине сразу после её цикла чтения
  3. Сразу после запуска копирующих горутин внутри merge
  4. Не закрывать, потребитель сам поймёт по таймауту

Разбор

Закрыть можно только когда все писатели закончили. Закрытие в каждой горутине даст панику при повторном close или при отправке другой горутины в закрытый канал. Закрытие сразу после запуска вызовет панику на первой отправке. Без закрытия range out у потребителя никогда не завершится. Ждать внутри merge синхронно тоже нельзя: merge должен вернуть канал сразу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.