Skip to content

Блокирование горутины, операции «попытка-отправка/получить»

Блокирование горутины навсегда

Механизм выбора — уникальная функция Go. Он предлагает множество шаблонов и приемов для параллельного программирования.

Мы можем использовать пустой блок выбора select{}, чтобы навсегда заблокировать текущую горутину. Это самый простой вариант использования механизма выбора. Некоторые варианты использования for {time.Sleep(time.Second)} в приведенных выше примерах можно заменить на select{}.

Как правило, select{} используется для предотвращения выхода основной горутины, так как если основная горутина выйдет, вся программа также завершится.

Пример.

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

Кстати, есть и другие способы заставить горутину навсегда остаться в заблокированном состоянии. Но select{}  самый простой способ.

«Попытка-отправка» и «попытка-получить»

Блок select с одной default ветвью и только с одной case ветвью называется операцией канала «попытка-отправка» или «попытка-получить» в зависимости от того, является ли операция канала, следующая за case ключевым словом, операцией отправки или приема канала.

  • Если операция, следующая за case ключевым словом, является операцией отправки, то select блок называется операцией попытки отправки. Если операция отправки будет заблокирована, то default ветвь будет выполнена (не будет отправлена), в противном случае отправка будет успешной и case будет выполнена единственная ветвь.

  • Если операция, следующая за case ключевым словом, является операцией приема, то select блок называется операцией попытки получения. Если операция получения будет заблокирована, то default ветвь будет выполнена (не будет получена), в противном случае получение будет выполнено успешно, и case будет выполнена единственная ветвь.

Операции try-send и try-receive никогда не блокируются.

Стандартный компилятор Go делает специальные оптимизации для блоков выбора try-send и try-receive, эффективность их выполнения намного выше, чем у блоков select с несколькими регистрами.

Ниже приведен пример, показывающий, как работают попытки отправки и получения.

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

Вывод вышеуказанной программы.