В каких случаях выполняется ветка default в select без блокировки?
Ветка default выполняется немедленно, если в момент выбора ни одна другая ветка select не готова к выполнению. В этом случае горутина не блокируется и продолжает работу сразу.
Если хотя бы одна операция уже готова, выбирается готовая коммуникационная ветка, а default не выполняется. Поэтому такой select превращает ожидание в проверку текущего состояния каналов.
Каналы в Go позволяют горутинам обмениваться данными, а select — ждать сразу несколько коммуникационных операций. Блокирующее ожидание удобно для обработчиков событий, но не подходит, когда нужно проверить канал и немедленно продолжить работу, если данных пока нет.
Ветка default появилась как средство неблокирующего обмена: она позволяет реализовать опрос канала, быстрый путь обработки или попытку отправки без ожидания получателя. Цена этого подхода — ответственность за частоту повторных проверок и нагрузку на процессор.
Без default горутина при отсутствии готовых операций ждёт: выполнение select приостанавливается до появления возможности отправить или получить значение либо до закрытия подходящего канала.
С default ожидания нет. Если поместить такой select в быстрый бесконечный цикл, который редко получает данные, цикл начнёт непрерывно проверять каналы и может загрузить ядро процессора, не выполняя полезной работы.
Алгоритм выбора можно описать так:
select.select.default, выполняется default.default отсутствует, горутина блокируется до изменения состояния каналов.Например, здесь получение из канала не может завершиться немедленно, поэтому программа сразу выполняет default:
default не означает тайм-аут и не резервирует канал. Если отправитель появится сразу после выбора default, уже начавшийся select не переключится задним числом; следующая проверка должна выполняться отдельно.
Для периодического ожидания обычно применяют блокирующий select с таймером или каналом отмены. Если нужна именно попытка без ожидания, количество таких попыток следует ограничивать либо добавлять паузу, чтобы избежать активного ожидания.
Главный компромисс таков: default уменьшает задержку реакции на отсутствие данных, но может увеличить потребление CPU и усложнить контроль справедливости обработки. В серверном коде постоянный опрос обычно хуже блокирующего ожидания, если нет отдельной причины продолжать работу без события.
Обработчик очереди должен принимать задачи, но параллельно проверять сигнал завершения. Разработчик добавил default в цикл и при отсутствии задач сразу начинал следующую итерацию. При пустой очереди горутина перешла в активное ожидание и стабильно потребляла процессор.
Рассматривались три варианта. Удаление default устраняло нагрузку, но обработчик переставал выполнять дополнительную работу между событиями. Добавление короткого Sleep снижало нагрузку, однако вводило фиксированную задержку и делало реакцию менее предсказуемой. Использование таймера в select позволяло задать верхнюю границу ожидания и выполнять периодическую работу без непрерывного опроса.
Выбрали блокирующий select с отдельной веткой таймера и веткой отмены. В результате обработчик просыпался только при задаче, завершении или наступлении запланированного интервала, поэтому загрузка CPU снизилась без потери управляемой периодической обработки.
default эквивалентом тайм-аута?Нет. default срабатывает сразу, когда готовой операции нет; он не ждёт заданный промежуток времени. Тайм-аут требует отдельного события, например канала таймера, включённого в блокирующий select.
default?Текущий select уже завершил выбор, поэтому новая готовность не изменит результат. Отправленное значение останется ждать следующего получения, если канал допускает это, либо отправитель будет ждать получателя — в зависимости от типа канала и дальнейших действий программы.
default может вредить даже при небольшом числе горутин?Потому что отсутствие готовых операций не приостанавливает горутину: она немедленно повторяет проверку. Несколько таких циклов создают активное ожидание, вытесняют полезную работу и увеличивают энергопотребление; блокирующее ожидание, таймер или явная пауза устраняют эту проблему, если немедленная повторная проверка не нужна.