空选择做什么?

时间:2013-09-06 15:44:39

标签: go

我在net/http/httptest中找到了以下代码,并想知道Go中空select语句的作用。

go s.Config.Serve(s.Listener)
if *serve != "" {
  fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
  select {}
}

3 个答案:

答案 0 :(得分:20)

select{}语句无限期地阻塞,即永远阻塞。它类似于空for{}语句。

在大多数(全部?)支持的Go架构中,空选择将产生CPU。空的for循环不会,即它将在100%CPU上“旋转”。

答案 1 :(得分:12)

在Mac OS X上,在Go中,for { }会导致CPU%达到最大值,进程的状态将为running

另一方面,

select { }不会导致CPU%达到最大值,并且进程的状态将为sleeping

答案 2 :(得分:5)

select语句只会阻止当前的goroutine。

至于你为什么要这样做,这是一个原因。此代码段相当于

if *serve != "" {
  fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
  s.Config.Serve(s.Listener)
} else {
  go s.Config.Serve(s.Listener)
}

没有浪费的goroutine更好。更糟糕的是,现在有代码重复。作者优化了浪费资源的较少代码重复。但请注意,永久性块goroutine很容易检测到,并且复制版本的成本可能为零。