Блокирование горутины, операции «попытка-отправка/получить»
Блокирование горутины навсегда
Механизм выбора — уникальная функция 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 с несколькими регистрами.
Ниже приведен пример, показывающий, как работают попытки отправки и получения.
Пришло время поработать с кодом!
Вывод вышеуказанной программы.