登录
首页 >  Golang >  Go问答

geth 1.9.25v 中的选择案例选择

来源:stackoverflow

时间:2024-03-19 23:00:35 255浏览 收藏

在 Go 语言中,`select` 语句用于从多个通道中选择一个进行通信。当多个通道都准备就绪时,`select` 会随机选择一个通道。这与通道的准备情况有关,即通道是否可以发送或接收数据。 在给定的代码示例中,`select` 语句有两个案例:`case s.next <- n` 和 `case m.fromAny <- n`。如果 `s.next` 通道准备接收数据,则会选择第一个案例;如果 `m.fromAny` 通道准备接收数据,则会选择第二个案例。如果两个通道都准备就绪,则会随机选择一个案例。

问题内容

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.nextm.fromany变量都在等待n

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

我可以知道首先选择哪个案例吗?如果准备好多个案例,是否有某种算法来挑选案例?


正确答案


我向您推荐go tour。在 go tour 中,他们有易于理解的实践演示,其中还介绍了 select 的行为。

链接至Go Tour on select

因此,select 会阻塞,直到其中一个案例可以运行,然后执行该案例。如果有多个,它会随机选择一个。

而且,这不仅与 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

因此,如果有多个案例,我们无法确定选择哪个案例。

好了,本文到此结束,带大家了解了《geth 1.9.25v 中的选择案例选择》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>