Goroutine:time.Sleep 或 time.After

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


慕少森
浏览 452回答 2
2回答

精慕HU

我认为这对大多数程序来说并不重要。关于 golang-nuts有一个关于此的问题,但我认为无法得出任何结论。在实践After中,在已经需要select在多个通道上但也希望超时的情况下很有用:select {case c := <-someChan:&nbsp; ..case c := <-otherChan:&nbsp; ..case <-time.After(time.Second * 42):}通过表面上看代码Sleep似乎更简单,同时After构建一个新的计时器,一个句点,一个闭包来发送它完成时的时间等。同样,我认为这在实践中并不重要,但time.Sleep看起来很可读,所以我会同意。在我的实现中,它们都执行完全相同的系统调用并最终等待:futex(??, FUTEX_WAIT, 0, {41, 999892351}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^ 41 seconds and change

慕慕森

每go101两者都会暂停当前的 goroutine 执行一段时间。不同的是函数调用 time.Sleep(d) 会让当前 goroutine 进入 sleep 子状态,但仍然保持在运行状态,而 channel 接收操作 <-time.After(d) 会让当前 goroutine 进入阻塞状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go