首页 > 解决方案 > Go select如何决定运行到默认分支?

问题描述

我有一个程序,其中有 256 个 goroutines 生成测试数据并将它们发送到一个通道。

在程序的消费部分,我设置了一个这样的选择:

select {
case c := <-theChan:
    // Do some stuff with c
default:
    //
}

令我惊讶的是,虽然 256 个 goroutine 不断向通道发送项目并且项目的处理需要时间?该程序多次运行到default分支中。

我想知道该select语句如何确定theChan为空并遇到default.

标签: go

解决方案


这取决于调度程序,但是在您从通道消耗一个值的时间和另一个 goroutine 获得调度程序分配的执行时间(这将在通道中添加一个值)之间,主 goroutine 可能有足够的时间来运行case 并返回到将select值添加到通道之前的语句,然后它将运行该default案例。

您可以通过使用缓冲通道来减少这种情况。


推荐阅读