> Как организовать прослушивание канала в отдельной горутине, чтобы избежать блокировок? (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для организации прослушивания канала в отдельной горутине без блокировок используется паттерн с select и контекстом. Основная идея - запустить горутину, которая читает из канала в бесконечном цикле, но с возможностью graceful shutdown.

Пример реализации:

GO
func listenChannel(ctx context.Context, ch <-chan int) {
for {
select {
case <-ctx.Done():
// Завершаем работу при отмене контекста
return
case val, ok := <-ch:
if !ok {
// Канал закрыт - выходим
return
}
// Обработка значения
process(val)
}
}
}
// Запуск в main
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ch := make(chan int, 10) // Буферизированный канал для снижения блокировок
go listenChannel(ctx, ch)

Ключевые моменты:

  • Используйте буферизированный канал, чтобы отправитель не блокировался при медленной обработке.
  • select с контекстом позволяет корректно завершить горутину, не допуская утечек.
  • Проверка ok при чтении из канала обязательна - она сигнализирует о закрытии канала.
  • Для избежания блокировок при отправке в канал из других горутин используйте select с default или контекстом.

Этот подход обеспечивает неблокирующее чтение и контролируемое завершение.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью