首頁 >後端開發 >Golang >為什麼我的 Go 程式在設定 GOMAXPROCS(2) 且 CPU 使用率很高的情況下仍會掛起?

為什麼我的 Go 程式在設定 GOMAXPROCS(2) 且 CPU 使用率很高的情況下仍會掛起?

Patricia Arquette
Patricia Arquette原創
2024-12-11 04:45:14306瀏覽

Why Does My Go Program Hang Despite Setting GOMAXPROCS(2) and High CPU Usage?

設定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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn