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核数),程序级别的线程