設定GOMAXPROCS(2) 後掛起
您已使用runtime.GOMAXPROCS(2) 將程式設定為允許兩個並發執行緒。然而,即使 CPU 使用率很高,程式在輸出數字時仍然會遇到掛起。
問題的出現是由於 forever() 函數中存在繁忙迴圈。繁忙循環持續運行,不會放棄對調度程序的控制。在這種情況下,forever() 函數實際上無限期地消耗了可用線程之一。
此行為會幹擾調度程序將剩餘執行緒分配給 show() 函數的能力,這就是程式似乎懸掛。 show() 函數也會在迭代之間休眠 1000 毫秒,導致效率低落。
解決方案
要解決此問題,您應該從永久中刪除繁忙循環() 函數並在 show() 函數內實現調度點。調度點允許調度器定期回收控制權,確保所有 goroutine 有機會運作。
這裡是修改後的程式碼:
func forever() { for { runtime.Gosched() } } func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) runtime.Gosched() fmt.Println(number) } }
透過在下列位置加入runtime.Gosched()在show()函數中的for迴圈結束,就可以消除問題,讓程式順利運行。
以上是為什麼我的 Go 程式在設定 GOMAXPROCS(2) 且 CPU 使用率很高的情況下仍會掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!