Go 协程
go协程
package main import ( "fmt" "runtime" "time" ) //goroutine--->协程---2kb大小,100 //线程----》几个m //go协程会复用线程 // goroutine之间通信,通过 信道channel 通信 //go推崇用信道通信,而不推崇用共享变量通信(锁,死锁) //启动一个goroutine func test() { fmt.Println("go go go") } //func main() { // fmt.Println("主线程开始执行") // go test() // go test() // go test() // go test() // go test() // go test() // go test() // go test() // time.Sleep(1*time.Second) // fmt.Println("主线程结束执行") // //go语言中,主线程不会等待goroutine执行完成,要等待它结束需要自己处理 //} //func main() { // fmt.Println("主线程开始执行") // for i:=0;i<10;i++ { // go func(){ // fmt.Println("go go go ") // // }() // } // time.Sleep(1*time.Second) // fmt.Println("主线程结束执行") // //go语言中,主线程不会等待goroutine执行完成,要等待它结束需要自己处理 //} // go 关键字开启goroutine,一个goroutine只占2kb /* go语言的GMP模型 -G:开的goroutine -M:M当成操作系统真正的线程,实际上是用户线程(用户线程) -P:Processor:现在版本默认情况是cpu核数(可以当做cpu核数) 用户线程,操作系统线程 python中,开的线程开出用户线程,用户线程跟操作系统线程1:1的对应关系 某些语言,用户线程和操作系统线程是n:1的关系 go语言,用户线程和操作系统线程是 n:m的关系 */ //举个例子 func main() { //设置P的大小,认为是cpu核数即可 runtime.GOMAXPROCS(1) fmt.Println("主线程开始执行") go func() { for { fmt.Println("xxxx") } }() //for i:=0;i<10;i++ { // go func(){ // for { // fmt.Println("我是死循环") // // } // // }() //} time.Sleep(10*time.Second) fmt.Println("主线程结束执行") }
GMP模型
Go的调度器通常被称为G-M-P模型,实际包含四个结构,分别为:
G:Goroutine,每个Gotoutine
M:machine,计算机线程
P:Processor,表示逻辑处理器(程序阶段可以定义它的大小,如果不写,就是cup核数),程序级别的线程