多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## MPG模型基本介绍 ![](https://img.kancloud.cn/f7/74/f774331e2c68a06a528c3d4fc2bb5806_1280x384.png) 1)M:操作系统的主线程(是物理线程)比较耗费资源 <br> 2)P:协程执行需要的上下文 <br> 3)G:协程 <br> <br> ### **MPG模式运行的状态1** ![](https://img.kancloud.cn/29/20/2920d1c0069c974661069599fb45bd74_1280x666.png) 1)当前程序有三个M,如果三个M都在一个cpu运行, 就是并发,如果在不同的cpu运行就是并行 2)M1,M2,M3正 在执行一一个G,M1的协程队列有三个,M2的协程队列有3个,M3协程队列有2个 3)从上图可以看到:Go的协程是轻量级的线程,是逻辑态的,Go可以容易的起上万个协程。 4)其它程序c/java的多 线程,往往是内核态的,比较重量级,几千个线程可能耗光cpu ### **MPG模式运行的状态2** 1)分成两个部分来看 2)原来的情况是M0主线程正在执行G0协程,另外有三个协程在队列等待 3)如果G0协程阻塞,比如读取文件或者数据库等 4)这时就会创建M1主线程(也可能是从已有的线程池中取出M1),并且将等待的3个协程挂到M1下开始执行,M0的 主线程下的G0仍然执行文件io的读写。 5)这样的MPG调度模式,可以既让G0执行,同时也不会让队列的其它协程一直阻塞,仍然可以并发/并行执行。 6)等到G0不阻塞了,M0会被放到空闲的主线程 继续执行(从已有的线程池中取),同时G0又会被唤醒。 ![](https://img.kancloud.cn/ee/2f/ee2fcfd507cb607bf378f1b693bbebb8_1078x720.png)