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.next
和 m.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.next
和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.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.next
和 m.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.next
和m.fromAny
同时准备好,任何情况都可以随机选择(定义中也有描述)。
n
可用,所以它取决于接收通道:s.next
和m.fromAny
。
因此,我们无法确定在多个案例准备就绪的情况下会选择哪个案例。