go协程和线程的区别
线程需要内核进程调度,有CPU时间片的概念,进行抢占式调度。
协程跟子程序执行类似,但是和子程序相比,协程有挂起的概念,协程可以挂起跳转执行其他协程,合适的时机再跳转回来。
相比其他语言,golang采用了MPG模型管理协程,更加高效,但是管理非常复杂。
M:内核级线程
G:代表一个goroutine
P:Processor,处理器,用来管理和执行goroutine的。P的个数取决于设置的GOMAXPROCS,go新版本默认使用最大内核数。
单核场景:P绑定了M之后,P执行(Local Run Queue)"本地运行队列"中的Go Routine,P绑定了M之后,其他的M则处于休眠状态。