为什么在Golang中选择(select)的代码实现是这样的?

huangapple go评论85阅读模式
英文:

Why is the code implemented like this ahout select in golang

问题

第一个代码片段中的default块是一个默认情况,当没有其他case语句准备好时,它会被执行。它的作用是在没有新的tsets到达时,防止select语句阻塞。这样可以确保程序不会永久阻塞在select语句中。

第二个代码片段中没有default块,因此当没有新的tsets到达时,select语句会阻塞,直到有新的tsets到达或者n.ctx.Done()被触发。

这两种实现方法的主要区别在于对于没有新的tsets到达时的处理方式。第一个代码片段中的default块允许程序继续执行其他操作,而第二个代码片段中的select语句会一直阻塞,直到有新的tsets到达或者n.ctx.Done()被触发。

对于这两种实现方法的影响,取决于具体的上下文和需求。如果你希望在没有新的tsets到达时执行其他操作,那么第一个代码片段中的default块是必需的。如果你希望在没有新的tsets到达时一直等待,直到有新的tsets到达或者上下文被取消,那么第二个代码片段就足够了。

请注意,这只是对代码片段的分析,具体的影响还取决于代码片段所在的上下文和整个程序的逻辑。

英文:
for {
    select {
    case <-n.ctx.Done():
	return
    case ts := <-tsets:
	n.reload(ts)
    default:
        select {
	case <-n.ctx.Done():
	    return
	case ts := <-tsets:
	    n.reload(ts)
	case <-n.more:
        }
    }
}

the code above is in https://github.com/prometheus/prometheus/blob/main/notifier/notifier.go Function Run(tsets <-chan map[string][]*targetgroup.Group). Why default write select again, Dose it has any difference with the following code

for {
    select {
    case &lt;-n.ctx.Done():
	return
    case ts := &lt;-tsets:
	n.reload(ts)
    case &lt;-n.more:
    }
}

I want to know the difference between these two implementation methods and their impact. thank u

答案1

得分: 3

这是通道优先级的典型实现。如果&lt;-tsets&lt;-n.more都可用,第一段代码将优先执行&lt;-tsets。实际上,只要&lt;-tsets可以执行,它就会循环执行,然后开始查看&lt;-n.more。请注意,只有当&lt;-tsets无法运行且上下文未被取消时,才会选择default情况。当发生这种情况时,它会查看&lt;-n.more

英文:

This is a typical implementation of channel priority. If both &lt;-tsets and &lt;-n.more are available, the first code snipped gives priority to &lt;-tsets. In fact, it will loop as long as &lt;-tsets can be executed, and then it will start looking at &lt;-n.more. Note that the only way the default case is selected is if &lt;-tsets cannot run and context is not canceled. When that happens, it looks at &lt;-n.more.

huangapple
  • 本文由 发表于 2023年7月25日 10:57:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76759183.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定