Goroutine:time.Sleep或time.After

时间:2016-06-17 22:32:26

标签: go

我想知道在goroutine time.Sleep()<-time.After()等待的最好方法是什么?两者之间有什么区别以及如何做出选择?感谢。

2 个答案:

答案 0 :(得分:16)

我认为对大多数节目来说并不重要。有一个question on golang-nuts about this,但我不认为可以得出任何结论。

在实践中,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

答案 1 :(得分:1)

go101

两者都将在一定时间内暂停当前goroutine执行。区别在于函数调用时间.Sleep(d)将使当前goroutine进入睡眠子状态,但仍保持运行状态,而通道接收操作<-time.After(d)将使当前goroutine进入睡眠状态阻止状态。