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