我在里面找到了下面的代码net/http/httptest,想知道空select语句在 Go 中做了什么。go s.Config.Serve(s.Listener)if *serve != "" { fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL) select {}}
3 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
空select{}
语句永远阻塞。它类似于一个空for{}
语句。
在大多数(全部?)支持的 Go 架构上,空的 select 将产生 CPU。一个空的 for 循环不会,即它会在 100% CPU 上“旋转”。
噜噜哒
TA贡献1784条经验 获得超7个赞
在 Mac OS X 上,在 Go 中, for { }
会导致 CPU% 达到最大值,并且进程的 STATE 将是running
select { }
,另一方面,不会导致 CPU% 达到最大值,并且进程的 STATE 将是 sleeping
慕桂英4014372
TA贡献1871条经验 获得超13个赞
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 检测起来很简单,并且可能比复制版本的成本为零。
- 3 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消