在 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中文网其他相关文章!