```go
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
//
wait := sync.WaitGroup{}
runtime.GOMAXPROCS(1)
wait.Add(20)
str := "ABCDEFGHIJKLM"
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 的现象
我所认为的理想状态下输出的内容
```
0123456789ABCDEFGHIM
```
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
//
wait := sync.WaitGroup{}
runtime.GOMAXPROCS(1)
wait.Add(20)
str := "ABCDEFGHIJKLM"
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 的现象
我所认为的理想状态下输出的内容
```
0123456789ABCDEFGHIM
```