Skip to content

Ограничение скорости и переключатели

Ограничение скорости

Как мы уже знаем, команду try-send можно использовать для ограничения пиковых значений. Мы также можем использовать try-send для ограничения скорости (с помощью тикера). На практике ограничение скорости часто используется, чтобы избежать превышения квоты и исчерпания ресурсов.

Ниже показан такой пример, позаимствованный из официальной вики Go. В этом примере количество обработанных запросов за одну минуту не будет превышать 200.

Пришло время поработать с кодом!

На практике мы часто используем ограничение скорости и пиковое/всплесковое ограничение вместе.

Переключатели

Отправка значения или получение значения из нулевого канала являются блокирующими операциями. Используя этот факт, мы можем изменить задействованные каналы в case операциях select кодового блока, чтобы повлиять на выбор ветви в select кодовом блоке.

Ниже приведен еще один пример пинг-понга, реализованный с использованием механизма выбора. В этом примере одной из двух переменных канала, задействованных в блоке выбора, является nil. Ветка, соответствующая нулевому каналу case, точно не будет выбрана. Мы можем думать, что такие case ветки находятся в выключенном состоянии. В конце каждого шага цикла состояния включения/выключения двух case ветвей переключаются.

Пришло время поработать с кодом!

Ниже приведен еще один непараллельный пример, который намного проще и также демонстрирует эффект переключения. Этот пример выведет 1212... во время работы. Практической пользы от него мало, но нам всё же важно с ним ознакомиться.

Пришло время поработать с кодом!

Веса возможности выполнения управляющего кода

Мы можем дублировать case ветвь в select блоке кода, чтобы увеличить вес возможности выполнения соответствующего кода.

Пример.

Пришло время поработать с кодом!

Возможность вызываемой функции f примерно равна двойнику вызываемой функции g.

Хотя количество ветвей в select блоке фиксировано, мы можем использовать функциональные возможности, предоставляемые reflect стандартным пакетом, для создания блока выбора во время выполнения. Динамически создаваемый блок select может иметь произвольное количество ветвей case. Но обрати внимание, что способ отражения менее эффективен, чем фиксированный способ.

Стандартный reflect пакет также предоставляет TrySend и TryRecv выполняет функции для реализации блоков выбора «один случай плюс значение по умолчанию».