項目倉庫:
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()
}