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