Выбор ответа Middle Паттерны конкурентности спрашивают часто обновлено
Закрытие выходного канала в fan-in
Вопрос
В функции merge несколько горутин копируют свои входы в общий out. Где правильно вызвать close(out)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В отдельной горутине после wg.Wait() по всем копирующим. Закрыть можно только когда все писатели закончили.
Варианты ответа
- В отдельной горутине после
wg.Wait()по всем копирующимправильный ответ - В каждой копирующей горутине сразу после её цикла чтения
- Сразу после запуска копирующих горутин внутри merge
- Не закрывать, потребитель сам поймёт по таймауту
Разбор
Закрыть можно только когда все писатели закончили. Закрытие в каждой горутине даст панику при повторном close или при отправке другой горутины в закрытый канал. Закрытие сразу после запуска вызовет панику на первой отправке. Без закрытия range out у потребителя никогда не завершится. Ждать внутри merge синхронно тоже нельзя: merge должен вернуть канал сразу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Паттерны конкурентности»
- Backpressure и ограничение нагрузки в Go-сервисе
- Что даёт errgroup.WithContext
- errgroup.SetLimit и TryGo
- Порядок graceful shutdown
- Graceful shutdown Go-сервиса по шагам
- Остановка pipeline при раннем выходе
- Зачем нужен worker pool
- Ограничение частоты запросов