select: ждать несколько каналов
У конвейера появился второй источник файлов: основной API и фолбэк на случай его простоя. Миша собрал шаг, который ждал первый ответивший источник, а не опрашивал их по очереди. Перебои основного API перестали останавливать загрузку.
select ждёт, пока хотя бы одна ветка не станет готова, и равномерно случайно выбирает одну из всех готовых веток.
Базовая форма
select {
case f := <-queue:
fmt.Println("из очереди:", f)
case f := <-retries:
fmt.Println("из повторов:", f)
}
select блокируется, пока хотя бы один case не станет готов, затем выполняет его. Это ответ на вопрос «какой источник готов первым» — то, чего не умеет одиночный <-ch. Конвейер больше не обязан опрашивать источники по очереди.
Случайный выбор при равенстве
Если готовы несколько веток, select выбирает равномерно случайно одну из них. Это гарантировано спецификацией: без случайности одна ветка могла бы «голодать» при постоянной готовности другой.
Select без каналов
select {} // блокировка навсегда
select без веток блокирует навсегда. Полезно, когда горутина должна жить вечно — например, горутина-наблюдатель конвейера, которая ждёт сигналов и не должна завершаться по «концу функции». Хотя обычно вечная жизнь выражается через ожидание канала.
Вы узнаете:
- как отправка в select работает как операция готовности
- какие правила синхронизации select наследует от каналов
select — ждать готовности любой ветки; при нескольких готовых — равномерно случайный выбор; select {} — вечная блокировка.
10 000 ₽ · 60 минут · онлайн