为了账号安全,请及时绑定邮箱和手机立即绑定

空选择有什么作用?

空选择有什么作用?

Go
海绵宝宝撒 2021-06-21 17:59:12
我在里面找到了下面的代码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 上“旋转”。


查看完整回答
反对 回复 2021-06-28
?
噜噜哒

TA贡献1784条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-06-28
?
慕桂英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 检测起来很简单,并且可能比复制版本的成本为零。


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信