Skip to content

Проверка закрытия канала без блокировки текущей горутины, ограничения

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

Способ проверки того, закрыт ли канал, широко используется в параллельном программировании Go, чтобы проверить, пришло ли уведомление. Уведомление будет отправлено путем закрытия канала в другой горутине.

Пиковое/импульсное ограничение

Мы можем реализовать пиковое ограничение, комбинируя каналы использования в качестве счетных семафоров и попытки отправки/попытки получения. Пиковый лимит (или пакетный лимит) часто используется для ограничения количества одновременных запросов без блокировки каких-либо запросов.

Ниже приведена модифицированная версия последнего примера в главе использования каналов в качестве счетных семафоров (глава 2.4).

Еще один способ реализации варианта использования «выигрывает первый ответ»

Как упоминалось в главе 2.2, мы можем использовать механизм выбора (try-send) с буферизованным каналом, пропускная способность которого равна как минимум единице, чтобы реализовать вариант использования «выигрывает первый ответ».

Пример.

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

Обрати внимание, что пропускная способность канала, используемого в приведенном выше примере, должна быть не менее единицы, чтобы первая отправка не была пропущена, если сторона получателя/запроса не подготовилась вовремя.

Третий способ реализации варианта использования «Побеждает первый ответ».

Для варианта использования «выигрывает первый ответ», если количество источников невелико, например, два или три, мы можем использовать select блок кода для одновременного получения ответов источника.

Пример.

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

Примечание: если канал, используемый в приведенном выше примере, является небуферизованным, то две горутины будут зависать навсегда после выполнения select блока кода. Это случай утечки памяти.