首頁 > 後端開發 > Golang > Go調度器什麼時候會創造新的M和P?

Go調度器什麼時候會創造新的M和P?

王林
發布: 2024-02-06 09:00:09
轉載
900 人瀏覽過

Go調度器什麼時候會創造新的M和P?

問題內容

剛剛學習了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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板