创建系统线程以及在系统线程间切换,会对程序的内存和性能造成较大的开销。
Go 的目标是尽量利用 CPU 多核资源。设计之初就考虑了高并发性。

M,P,G 模型
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