Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.
Как не блокироваться навечно при чтении из пустого канала? Что такое select и его паттерны?
Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.
Пример отменяемого ожидания:
select {
case value, ok := <-ch:
if !ok { return }
use(value)
case <-ctx.Done():
return
}
Закрытый канал готов к чтению, поэтому проверяйте ok, иначе цикл может бесконечно получать нулевые значения. Nil-канал отключает соответствующую ветку select. Для длительного ожидания задайте дедлайн контекста, а не создавайте бесконечно новые таймеры внутри горячего цикла.