Goroutine:time.Sleep或time.After

J F*_*ird 14 go

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

cni*_*tar 20

我认为对大多数项目来说并不重要.关于这个问题有一个关于golang-nuts问题,但我不认为可以得出任何结论.

实际上After,在一个已经需要select在多个通道上但又想要超时的环境中非常有用:

select {
case c := <-someChan:
  ..
case c := <-otherChan:
  ..
case <-time.After(time.Second * 42):
}
Run Code Online (Sandbox Code Playgroud)

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

同样,我认为它在实践中并不重要,但time.Sleep看起来很可读,所以我会坚持下去.


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

futex(??, FUTEX_WAIT, 0, {41, 999892351}
                          ^^ 41 seconds and change
Run Code Online (Sandbox Code Playgroud)


zan*_*ngw 7

走101

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