當Go 調度器建立新的M 和P
在Go 程式語言中,goroutine 是由作業系統( OS)執行緒、 goroutine 處理器(P)和機器資源(M)。雖然了解這些元件如何互動很重要,但確定何時建立新的 M 和 P 可能具有挑戰性。
理解 M 和 P 的創建
M是 machine 的縮寫,它代表執行 goroutine 的輕量級作業系統執行緒。另一方面,P 代表處理器,管理特定 M 上的 Goroutines 的執行。 Go 調度程式根據需要建立新的 M 來處理 Goroutine。
在阻塞任務的情況下
在您的範例中,您定義了一個測試函數,該函數會產生多個 goroutine 來執行資料庫操作。每個 goroutine 都被設計為阻塞一定的持續時間,模擬 goroutine 不主動執行的場景。在這種情況下,Go 調度器不會建立額外的 M,因為現有的 M 可以不間斷地處理阻塞 Goroutine。
但是,如果 Goroutine 執行系統呼叫或遇到阻塞操作,執行該 Goroutine 的 M會暫時阻塞。為了保持回應能力,調度程序將創建一個新的 M 並將其指派給新的 P 來執行任何待處理的 goroutine。
M 和 P 關係
需要注意的是M和P之間是1:1的關係。單一M一次只能運行在一個P上,反之亦然。當M阻塞時,調度器會尋找空閒的P。如果沒有空閒的P,則會建立一個新的P並將其指派給等待的M。
額外資源
進一步探討這個主題,請參考以下資料:
了解Go 調度程序何時創建新的M 和P 對於優化Go應用程式至關重要。透過考慮阻塞操作的可能性以及 M 和 P 之間的 1:1 關係,您可以設計高效的 goroutine 管理程式碼,並在可用資源的限制內最大化並發性。
以上是Go調度器什麼時候為阻塞任務創建新的M和P?的詳細內容。更多資訊請關注PHP中文網其他相關文章!