Одновременный выбор в буферизованном канале отправки и небуферизованном приемном канале
В Go каналы предоставляют механизм для одновременного взаимодействия между горутинами. В этом вопросе рассматривается, как одновременно выбирать буферизованный канал отправки и небуферизованный канал приема, позволяя горутинам отправлять или получать данные в зависимости от доступности канала.
Выбор буферизованного канала отправки
Чтобы выбрать буферизованный канал отправки, например s, где данные могут быть поставлены в очередь до их получения, вы можете использовать следующее синтаксис:
case s <- v: // Send value `v` to channel `s`
Однако при использовании буферизованных каналов отправляемое значение должно быть оценено заранее, что потенциально может привести к отправке устаревших данных из-за условий гонки.
Выбор небуферизованного канала приема
Выбор небуферизованного канала приема, например r, где данные не ставятся в очередь, это просто:
case r := <-r: // Receive value `r` from channel `r`
По умолчанию выбор на канале приема блокируется до тех пор, пока данные не станут доступными.
Одновременный выбор
Чтобы выбрать одновременно и буферизованный канал отправки s, и небуферизованный канал приема r, вы можете использовать следующий оператор выбора:
select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // No channels are ready, do something else, e.g. sleep }
Обработка устаревших данных
При оценке значения для отправки с помощью v := valueToSend() вне оператора select возможно, что канал s станет полным или канал r получает данные до отправки значения. Чтобы избежать устаревших данных, в оператор выбора можно добавить регистр по умолчанию. Этот вариант по умолчанию будет выполняться, если ни один из каналов не готов, и его можно использовать для кратковременного перехода в режим сна, давая каналу время достичь состояния готовности.
Избегание прямых проверок длины канала
Важно отметить, что проверка длины или пропускной способности канала с последующей отправкой или получением ненадежна. Состояние канала может меняться между моментом проверки и отправкой/получением, что приводит к неожиданному поведению блокировки.
Заключение
При использовании оператора select с регистром по умолчанию горутины может одновременно выбирать буферизованный канал отправки и небуферизованный канал приема, оптимизируя использование канала и эффективность использования ресурсов. Однако крайне важно учитывать возможность устаревших данных и избегать прямых проверок длины канала, чтобы обеспечить надежную связь.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3