Golang-GMP模型的協(xié)程調(diào)度

項目倉庫:
https://github.com/Benny66/goStudy.git

/*
1、runtime.GOMAXPROCS(1) 設(shè)置了 P 只有一個,即程序只能運行一個 協(xié)程(Goroutine);
2、主協(xié)程 main 被掛載在這個唯一 P 中;
3、兩個 for 循環(huán)創(chuàng)建了 20 個協(xié)程(Goroutine),因為 P 正在被占用,所有的 Goroutine 依次掛在這個 P 的待執(zhí)行的隊列中
    這里需要關(guān)注一下協(xié)程的創(chuàng)建與掛載在 P 下的邏輯。
    因為執(zhí)行結(jié)果可見,如果忽視第一行結(jié)果可見,這個 Goroutine 的執(zhí)行是 FIFO (先進先出)的關(guān)系
    而第一行結(jié)果出現(xiàn)的原因是,P 有兩個隊列,一個是這個 FIFO 的隊列,還有一個叫做 runnext 的隊列。新創(chuàng)建的 Goroutine 會先被掛在這個 runnext 中;
*/
func TestGoroutine(t *testing.T) {
    runtime.GOMAXPROCS(1)
    wg := sync.WaitGroup{}
    wg.Add(20)
    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("i1: ", i)
            wg.Done()
        }()
    }
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println("i2: ", i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容