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

Goroutine:time.Sleep 或 time.After

Goroutine:time.Sleep 或 time.After

Go
慕少森 2022-01-17 18:37:33
我想知道在 goroutine 中等待的更好方法是什么,time.Sleep()或者<-time.After()?两者有什么区别,如何选择?谢谢。
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我认为这对大多数程序来说并不重要。关于 golang-nuts有一个关于此的问题,但我认为无法得出任何结论。


在实践After中,在已经需要select在多个通道上但也希望超时的情况下很有用:


select {

case c := <-someChan:

  ..

case c := <-otherChan:

  ..

case <-time.After(time.Second * 42):

}

通过表面上看代码Sleep似乎更简单,同时After构建一个新的计时器,一个句点,一个闭包来发送它完成时的时间等。


同样,我认为这在实践中并不重要,但time.Sleep看起来很可读,所以我会同意。


在我的实现中,它们都执行完全相同的系统调用并最终等待:


futex(??, FUTEX_WAIT, 0, {41, 999892351}

                          ^^ 41 seconds and change


查看完整回答
反对 回复 2022-01-17
?
慕慕森

TA贡献1856条经验 获得超17个赞

go101

两者都会暂停当前的 goroutine 执行一段时间。不同的是函数调用 time.Sleep(d) 会让当前 goroutine 进入 sleep 子状态,但仍然保持在运行状态,而 channel 接收操作 <-time.After(d) 会让当前 goroutine 进入阻塞状态。


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

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