我想知道在goroutine time.Sleep()
或<-time.After()
等待的最好方法是什么?两者之间有什么区别以及如何做出选择?感谢。
答案 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)
两者都将在一定时间内暂停当前goroutine执行。区别在于函数调用时间.Sleep(d)将使当前goroutine进入睡眠子状态,但仍保持运行状态,而通道接收操作<-time.After(d)将使当前goroutine进入睡眠状态阻止状态。