for i := 0; i < 10; i++ { go func(i int) { fmt.Println(i, "---") wait.Done() }(i) }
for i, l := 0, len(str); i < l; i++ { go func(i int) { fmt.Println(string(str[i])) wait.Done() }(i) } fmt.Println("---------------") wait.Wait() }
``` 为什么这个程序会优先执行下面这个 goroutine 中的最后一个,然后再回到上面去执行 输出结果如下 ``` --------------- M 0 --- 1 --- 2 --- 3 --- 4 --- 5 --- 6 --- 7 --- 8 --- 9 --- A B C D E F G H I ``` 如果从 GMP 的角度去看的话,一开始设置了 P 的数量为 1 那后续 G0 调用玩 goroutine 之后,把后续的 G 都塞到了本地 p 的队列里面 m 从里面取 输出的结果不应该是顺序的嘛, 为什么会产生单独输出一次 M 的现象