2 回答

TA貢獻1111條經(jīng)驗 獲得超0個贊
不,這里沒有必要,因為每當 Go 在等待通道或等待 I/O 時,它允許其他 goroutines 自動運行。自 Go 1.0 以來就是這種情況。
在Go 1.2中,Go 運行時的調(diào)度程序會在您調(diào)用函數(shù)時添加自動搶占點。在此之前,如果你有一個 CPU 綁定循環(huán)(即使有一個函數(shù)調(diào)用),它可能會使調(diào)度程序餓死,你可能需要runtime.Gosched
.
然后在Go 1.14中,他們使運行時的這方面變得更好,甚至沒有函數(shù)調(diào)用的緊密 CPU 綁定循環(huán)也會自動被搶占。
因此,對于任何 Go 版本,您都不需要runtime.Gosched
在等待通道或 I/O 時調(diào)用;在 1.14 之前,如果您正在進行長時間運行的計算,您可能想調(diào)用它。但是對于 Go 1.14+,我不明白為什么你需要手動調(diào)用它。
如果我正在審查您的實際代碼,我建議將其更改為一個簡單的for ... range
循環(huán):
for msg := range msgCh { fmt.Println(msg) }
這將等待每條消息進入并打印它,如果/當通道關(guān)閉時停止。switch
但是,如果您正在等待另一個通道或完成信號,例如上下文,您會想要一個。是這樣的:
for {
select {
case msg := <- msgCh:
fmt.Println(msg)
case <-ctx.Done():
return
}
}
- 2 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報