G —— goroutinue对象,经go语句创建
M —— 系统线程,和P关联后运行G,上限10000,M
指的是Machine
,一个M
直接关联了一个内核线程。由操作系统管理
P —— 调度器,和M关联后运行G,数量由 runtime.MAXGOPROCS 设置,默认为CPU核数,上限256
此外还有一个系统调度器(runtime.sched),负责维护一些全局队列。
i := runtime.GOMAXPROCS(0) //返回获取当前cpu核心(内核个数 * 超线程)
go1.5 (released 2015/08/19) 之后,默认就设置了GOMAXPROCS 为最大 cores 数量,无需设置
https://www.jb51.cc/go/187083.html
package main
import(
"fmt"
"runtime"
)
func main() {
i := runtime.GOMAXPROCS(2) //返回获取当前cpu核心个数,哪怕你设置了2
//可以在任务管理器中看到本进程cpu占用达到200%
fmt.Println(i)
go task()
go task()
go task()
go task()
go task()
select{}
}
func task(){
for {
}
}
批量创建goroutinue传参需要注意的:
for i := 0; i < 10; i++{
//i作为参数传给goroutinue,否则goroutine接受的参数,可能不是期望的
//因为创建goroutinue的时候,可能被中断,i的值,已经改变了
go func(value int){
fmt.Printf("recv %d \n", value)
}(i)
}