Вступить в клуб →
средняявопросКонкурентность: горутины, каналы, context

Несколько продюсеров закрывают один и тот же канал

Из нескольких источников события сливаются в один канал:

results := make(chan Event)

for _, src := range sources {
    go func(s Source) {
        for _, e := range s.Read() {
            results <- e
        }
        close(results)
    }(src)
}

for e := range results {
    handle(e)
}

Сервис периодически падает с panic: send on closed channel. Как правильно исправить?

  • Закрывать канал в потребителе после выхода из `range` — тогда продюсеры не конфликтуют
  • Убрать `close` из продюсеров и закрывать канал один раз в отдельной горутине после `wg.Wait()`
  • Добавить каналу буфер — при буферизации `close` становится безопасным
  • Обернуть `close(results)` в `sync.Once` в каждой горутине — повторное закрытие станет безвредным

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела