Skip to content

Каналы

В этой теме мы рассмотрим многие варианты использования каналов, асинхронное и параллельное программирование в Go, а также метод синхронизации каналов.

Использование каналов как futures/promises

Futures и promises используются во многих других популярных языках. Они часто связаны с запросами и ответами.

Возвращение каналов только для приема в качестве результатов

В примере ниже sumSquares одновременно запрашиваются значения двух аргументов вызова функции. Каждая из двух операций приема канала будет заблокирована до тех пор, пока операция отправки не будет выполнена на соответствующем канале. Для возврата окончательного результата требуется около трех секунд вместо шести.

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

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

Как и в предыдущем примере, в следующем примере значения двух аргументов вызова функции sumSquares запрашиваются одновременно. В отличие от последнего примера, функция longTimeRequest принимает в качестве параметра канал только для отправки, а не возвращает результат канала только для приема.

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

На самом деле, в указанном выше примере нам не нужны два канала для передачи результатов. Использование одного канала — это нормально.

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

Это своего рода агрегация данных, которая будет специально представлена далее.

Быстрый ответ

Это усовершенствование варианта с использованием только одного канала в предыдущем примере.

Иногда часть данных может быть получена из нескольких источников, чтобы избежать больших задержек. Для многих факторов продолжительность отклика этих источников может сильно различаться. Даже для указанного источника длительность его отклика также непостоянна. Чтобы сделать продолжительность ответа как можно короче, мы можем отправить запрос каждому источнику в отдельной горутине. Будет использован только первый ответ, остальные более медленные будут отброшены.

Обрати внимание: если есть N источников, пропускная способность канала связи должна быть не менее N-1, чтобы навсегда избежать блокировки горутин, соответствующих отброшенным ответам.

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

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