select case selection in geth 1.9.25v

select case selection in geth 1.9.25v

func (m *FairMix) runSource(closed chan struct{}, s *mixSource) {
    defer m.wg.Done()
    defer close(s.next)
    for s.it.Next() {
        n := s.it.Node()

        fmt.Println("discmix Addsource : ", n.ID())
        select {
        case s.next <- n:
            fmt.Println("s.next <- n :", n.ID())
        case m.fromAny <- n:
            fmt.Println("m.fromAny <- n :", n.ID())
        case <-closed:
            return
        }
    }
}

这是以太坊 geth 1.9.25v 代码。

select操作中,这两个s.next & m.fromAny变量都在等待n.

但是当我 运行 程序时,与案例 m.fromAny <- n 相比,case s.next <- n 被更频繁地选择。

我能知道先选择哪种情况吗?如果多个案例准备就绪,是否有一些选择案例的算法?

我向您推荐 Go Tour。在 Go Tour 中,他们有易于理解的动手游乐场,其中还介绍了 select 的行为。

Link 到 Go Tour on select

所以,一个 select 阻塞,直到它的一个 case 可以 运行,然后它执行那个 case。如果准备好多个,它会随机选择一个。

而且,这不仅仅是关于 n,还有关于 s.nextm.fromAny

所以,让我们考虑这两种情况:

// For this case to be selected s.next should be ready
case s.next <- n


// For this case to be selected m.fromAny should be ready
case m.fromAny <- n

所以,假设s.nextm.fromAny同时准备好,任何情况都可以随机选择(定义中也有描述)。

n可用,所以它取决于接收通道:s.nextm.fromAny

因此,我们无法确定在多个案例准备就绪的情况下会选择哪个案例。