M,P,G 模型创建系统线程以及在系统线程间切换,会对程序的内存和性能造成较大的开销。
Go 的目标是尽量利用 CPU 多核资源。设计之初就考虑了高并发性。
Go
Go
MPG
MPGo
P,M,G
GPM
example
func main(){
var wg sync.WaitGroup
wg.add(2)
go func(){
fmt.Println("hello")
wg.Done()
}()
go func(){
fmt.Println("world")
wg.Done()
}()
wg.Wait()
}
execute stream
GoCPUPP
PPM
PMMM
Go内核级线程MhelloworldMP
GoMP
系统调用
GoPMMP
让我们来看一个读取文件的例子:
func main(){
buf:=make([]byte,0,2)
fd,_ := os.Open("number.txt")
fd.Read(buf)
defer fd.Close()
fmt.Printlb(string(buf))
}
GP0Go
PP0PGM
GoI/OhttpGonetwork poller
以下是例子:
func main(){
http.Get("https://httpstat.us/200")
}
network pollerMG
GoGnetwork pollerGGG
关于系统线程数的限制
GoGo
GOMAXPROCSGoGOMAXPROCS
以下是一个例子
func main(){
var wg sync.WaitGroup
for i:=0;i<100;i++ {
wg.Add(1)
go func(){
http.Get(`https://httpstat.us/200?sleep=10000`)
wg.Done()
}()
}
wg.Wait()
}
Gofor
tracing
1002