Материал проходит вычитку — возможны неточности.
Урок 81 из 118

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 наследует от каналов
<!-- wp:course-hub/quiz {"title":"Проверьте себя","questions":[{"text":"a готов через 10 мс, b — сразу. select { case <-a; case
Итоги

select — ждать готовности любой ветки; при нескольких готовых — равномерно случайный выбор; select {} — вечная блокировка.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки