看下面代码
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("A: ", i)
wg.Done()
}()
}
for i:= 0; i < 10; i++ {
go func(i int) {
fmt.Println("B: ", i)
wg.Done()
}(i)
}
wg.Wait()
}
问代码输出什么, 根本看不懂。
runtime.GOMAXPROCS(1)
设置最大可用cpu数量,这里故意设置成1, 只考虑一个cup的情况。
然后引出pmg概念。
p : cup
m:M(work thread)代表工作线程
g: G对象(goroutine)
摘抄:
在单核情况下,所有goroutine运行在同一个线程(M0)中,
每一个线程维护一个上下文(P),任何时刻,
一个上下文中只有一个goroutine,其他goroutine在runqueue中等待。
一个goroutine运行完自己的时间片后,
让出上下文,自己回到runqueue中(如下图左边所示)。
当正在运行的G0阻塞的时候(可以需要IO),
会再创建一个线程(M1),P转到新的线程中去运行。
![](https://img.haomeiwen.com/i13303914/0f49e7757358e6cb.png)
WaiteGroup啥意思,哈哈,挖到宝了。
https://studygolang.com/articles/12972?fr=sidebar
利用管道可以实现goroutine按顺序执行,但有些大材小用,数量多内存开销大,可以用WaiteGroup代替。
也很简单,就这三个方法 Add(), Done(), Wait()。
wait挂起, add计数,如果计数成功, done关闭, 挂起下面的代码继续执行。
网友评论