亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 441 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號