> Как организовать прослушивание канала в отдельной горутине, чтобы избежать блокировок? (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Для организации прослушивания канала в отдельной горутине без блокировок используется паттерн с select и контекстом. Основная идея - запустить горутину, которая читает из канала в бесконечном цикле, но с возможностью graceful shutdown.
Пример реализации:
GOfunc listenChannel(ctx context.Context, ch <-chan int) {for {select {case <-ctx.Done():// Завершаем работу при отмене контекстаreturncase val, ok := <-ch:if !ok {// Канал закрыт - выходимreturn}// Обработка значенияprocess(val)}}}// Запуск в mainctx, cancel := context.WithCancel(context.Background())defer cancel()ch := make(chan int, 10) // Буферизированный канал для снижения блокировокgo listenChannel(ctx, ch)
Ключевые моменты:
- Используйте буферизированный канал, чтобы отправитель не блокировался при медленной обработке.
selectс контекстом позволяет корректно завершить горутину, не допуская утечек.- Проверка
okпри чтении из канала обязательна - она сигнализирует о закрытии канала. - Для избежания блокировок при отправке в канал из других горутин используйте
selectсdefaultили контекстом.
Этот подход обеспечивает неблокирующее чтение и контролируемое завершение.
> Похожие задачи по Go
Какая основная идея воркерпула?
Когда можно закрыть канал при нескольких писателях и читателях в Go?
Что происходит с горутиной, если она пытается записать в канал после ошибки?
Что делать, если нельзя писать логи внутри функции fetch, а можно только в функции main?
> Похожие задачи по backend
Какая основная идея воркерпула?
Когда можно закрыть канал при нескольких писателях и читателях в Go?
Что происходит с горутиной, если она пытается записать в канал после ошибки?
Что делать, если нельзя писать логи внутри функции fetch, а можно только в функции main?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью