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 代码。在操作中,这两个 &变量都在等待 。selects.nextm.fromAnyn但是当我运行程序时,与大小写相比,被更频繁地选择。case s.next <- nm.fromAny <- n我能知道哪个案例会首先被选中吗?如果多个案例准备就绪,是否有某种选择案例的算法?
1 回答
慕村225694
TA贡献1880条经验 获得超4个赞
我会推荐你去旅游。在Go Tour中,他们拥有易于理解的动手操场,他们也涵盖了他们的行为。select
链接到选择去游览
因此,一个阻止,直到它的一个案例可以运行,然后它执行该案例。如果多个准备就绪,它会随机选择一个。select
而且,这不仅仅是关于和。ns.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
因此,我们无法确定如果多个案例准备就绪,将选择哪种情况。
- 1 回答
- 0 关注
- 67 浏览
添加回答
举报
0/150
提交
取消