剛剛學習了golang GMP模型,現在我了解了goroutines、作業系統執行緒和golang上下文/處理器如何相互協作。但我還是不明白什麼時候會產生M和P?
例如,我有一個測試程式碼來在資料庫上運行一些操作,並且有兩個測試案例(兩批 goroutine):
func Test_GMP(t *testing.T) { for _ = range []struct { name string }{ {"first batch"}, {"second batch"}, } { goroutineSize := 50 done := make(chan error, goroutineSize) for i := 0; i < goroutineSize; i++ { go func() { // do some databases operations... // each goroutine should be blocked here for some time... // propogate the result done <- nil }() } for i := 0; i < goroutineSize; i++ { select { case err := <-done: assert.NoError(t, err) case <-time.After(10 * time.Second): t.Fatal("timeout waiting for txFunc goroutine") } } close(done) } }
以我的理解,如果M是在需要時創建的。在第一批 goroutine 中,將建立 8 個(我電腦上的虛擬核心數量)作業系統線程,第二批將只重複使用這 8 個作業系統線程,而不是建立新線程。這是正確的嗎?
如果您可以提供有關此主題的更多材料或博客,我們將不勝感激。
只有當您的進程沒有阻塞或沒有任何系統呼叫時,M 才可重複使用。在您的情況下,您的 go func()
中有阻塞任務。因此,M 的數量不會限制為 8(我計算機上的虛擬核心數)。第一批將阻塞並從 P 中刪除,並等待阻塞進程完成,同時新的 M 建立與 P 的關聯。
請參閱以下內容以了解更多詳細信息,
#以上是Go調度器什麼時候會創造新的M和P?的詳細內容。更多資訊請關注PHP中文網其他相關文章!