Go select 语句优先级解决方法
考虑以下场景:您希望 Go 例程监视两个通道,当两个通道都处于阻塞状态时,保持阻塞状态空的。但是,当两个通道都包含数据时,您需要先排空一个通道,然后再处理另一个通道。
原始问题:
在提供的代码示例中,您有一个输出通道和一个出口通道。您希望在处理退出信号之前处理所有输出值。但是,select 语句没有内置的优先级机制。
解决方案:
Go 原生支持这种优先级,无需解决方案。解决方案包括使退出通道仅可供生产者访问。当生产者完成时,它关闭退出通道。消费者继续从 out 通道读取数据,直到它为空并且退出通道关闭。
修改后的代码如下所示:
package main import ( "fmt" "math/rand" "time" ) var ( produced = 0 processed = 0 ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { select { case <-quit: fmt.Println("RECV QUIT") return default: out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) produced++ } } } func main() { vals, quit := make(chan int, 10), make(chan bool) go produceEndlessly(vals, quit) for x := range vals { fmt.Println(x) processed++ time.Sleep(time.Duration(rand.Int63n(5e8))) } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
说明:
修改后的代码中,只有生产者 goroutine 可以访问退出通道。当生产者完成时,它关闭退出通道。消费者 goroutine 继续从 out 通道读取数据,直到它为空并且退出通道关闭。这可确保在消费者退出之前处理所有输出值。
以上是如何在 Go 的 select 语句中优先考虑通道读取?的详细内容。更多信息请关注PHP中文网其他相关文章!