空选择有什么作用?

我在里面找到了下面的代码net/http/httptest,想知道空select语句在 Go 中做了什么。


go s.Config.Serve(s.Listener)

if *serve != "" {

  fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)

  select {}

}


海绵宝宝撒
浏览 214回答 3
3回答

牛魔王的故事

空select{}语句永远阻塞。它类似于一个空for{}语句。在大多数(全部?)支持的 Go 架构上,空的 select 将产生 CPU。一个空的 for 循环不会,即它会在 100% CPU 上“旋转”。

噜噜哒

在 Mac OS X 上,在 Go 中, for { }会导致 CPU% 达到最大值,并且进程的 STATE 将是runningselect { },另一方面,不会导致 CPU% 达到最大值,并且进程的 STATE 将是 sleeping

慕桂英4014372

emptyselect语句只会阻塞当前的 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 检测起来很简单,并且可能比复制版本的成本为零。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go