首页 >后端开发 >Golang >如何在 Go 中同时选择缓冲发送和无缓冲接收通道?

如何在 Go 中同时选择缓冲发送和无缓冲接收通道?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-29 07:20:30218浏览

How to Select on a Buffered Send and Unbuffered Receive Channel Simultaneously in Go?

同时选择发送和接收通道

在 Go 中,可以使用 select 语句在通道上执行非阻塞 I/O 操作。然而,在处理缓冲发送通道 (chan

检查通道长度/容量的问题

一种常见的方法是在发送或接收之前检查通道的长度或容量。但是,这是不可靠的,因为通道的状态可能会在检查和后续操作之间发生变化:

<code class="go">if len(r) > 0 {
    // Optionally execute other code

    r <- v  // May block if another goroutine received from r in the meantime
}</code>

解决方案:带有时间延迟的默认情况

要解决此问题,您可以使用包含短时间延迟的默认情况的 select 语句。这可以防止过度的 CPU 使用,同时允许您在两个通道都没有准备好时重试操作:

<code class="go">s := make(chan<- int, 5)
r := make(<-chan int)

for {
    v := valueToSend()
    select {
    case s <- v:
        fmt.Println("Sent value:", v)
    case vr := <-r:
        fmt.Println("Received:", vr)
    default: // If none are ready, delay execution
        time.Sleep(time.Millisecond * 1)
    }
}</code>

通过添加默认情况,如果两个通道都没有准备好,程序只会阻塞一小段时间,允许在等待通道可用时释放 CPU 资源。

以上是如何在 Go 中同时选择缓冲发送和无缓冲接收通道?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn