空选择做什么?

问题描述 投票:25回答:3

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

go s.Config.Serve(s.Listener)
if *serve != "" {
  fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
  select {}
}
go
3个回答
20
投票

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

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


12
投票

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

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


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很容易检测到,并且复制版本的成本可能为零。

© www.soinside.com 2019 - 2024. All rights reserved.