理解Go Scheduler 中的M 和P 建立
Go 調度器在涉及goroutine、OS 執行緒(M) 和上下文的模型上運轉/處理器(P)。為了優化效能,調度程序動態管理 M 和 P 的建立和使用。
M 的建立
當排程器偵測到需要執行阻塞時建立 M任務。在範例程式碼中,goroutines 執行阻塞資料庫操作,這將觸發建立額外的 M。創建的 M 的確切數量取決於阻塞 goroutine 的數量和可用的系統資源。
建立P
P 是在新的 goroutine 啟動時建立的。然而,調度器不會為每個 goroutine 創建一個新的 P。相反,它會重複使用現有的 P 實例,維持固定數量的 P 等於 GOMAXPROCS 的值,通常設定為可用 CPU 的數量。
在您的範例程式碼中
在您的測試程式碼中,您分兩批創建了 50 個 goroutine。由於資料庫操作是阻塞的,因此將根據需要建立 M 來處理阻塞 goroutine。但是,由於 P 實例被重複使用,因此只會建立 8 個 P,代表系統上虛擬核心的數量。
更多資源
欲進一步探索此問題主題,請參考以下資源:
以上是在有阻塞操作的情況下,Go 調度程序如何管理 M 和 P 的建立?的詳細內容。更多資訊請關注PHP中文網其他相關文章!