临沂网站建设兼职,商城网站设计实训总结,公司变更证明模板,珠海招聘网最新招聘信息请记住go并发的真理#xff1a;Do not communicate by sharing memory; instead, share memory by communicating.不要以共享内存的方式来通信#xff0c;相反#xff0c;要通过通信来共享内存。go语言天生的并发大家都知道#xff0c;可是go是如何实现轻松的构造上万的协程…请记住go并发的真理Do not communicate by sharing memory; instead, share memory by communicating.不要以共享内存的方式来通信相反要通过通信来共享内存。go语言天生的并发大家都知道可是go是如何实现轻松的构造上万的协程呢今天我们就说一下go并发的MPG模型。后续会有更多的模式和算法以及区块链相关的如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者都可以关注一下。微信公众号Go语言之美更多go语言知识信息等。公众号会持续为大家分享更多干货。M 代表着一个内核线程也可以称为一个工作线程。goroutine就是跑在M之上的P 代表着(Processor)处理器 它的主要用途就是用来执行goroutine的一个P代表执行一个Go代码片段的基础可以理解为上下文环境所以它也维护了一个可运行的goroutine队列和自由的goroutine队列里面存储了所有需要它来执行的goroutine。G 代表着goroutine 实际的数据结构(就是你封装的那个方法)并维护者goroutine 需要的栈、程序计数器以及它所在的M等信息。Seched 代表着一个调度器 它维护有存储空闲的M队列和空闲的P队列可运行的G队列自由的G队列以及调度器的一些状态信息等。多个goroutine并发合作上面这个图生动的说明多个协程工作形式其中每一个gopher土拨鼠可以看作一个协程G其实对于这些gopher还有一个包工头的gopher他来管理这些工作的gopher这个包工头就可以看作一个 Seched。MPG我们在看上面这个图图中P正在执行的Goroutine为蓝色的处于待执行状态的Goroutine为灰色的灰色的Goroutine形成了一个队列runqueues。我们再看一下三者的宏观图MPG宏观图在这里当一个P关联多个G时就会处理G的执行顺序就是并发当一个P在执行一个协程工作时其他的会在等待当正在执行的协程遇到阻塞情况例如IO操作等go的处理器就会去执行其他的协程因为对于类似IO的操作处理器不知道你需要多久才能执行结束所以他不回去等你执行完。上面我们看着go的并发好像是抢占式的事实上go的协程是非抢占式的由协程主动交出控制权也就是说上面在发生IO操作时并不是调度器强制切换执行其他的协程而是当前协程交出了控制权调度器才去执行其他协程。我们列举一下goroutine可能切换的点I/Oselectchannel等待锁runtime.Gosched()这些点是go协程可能切换的地方但是并不是一定切换的。正是因为是非抢占式的所以才轻松的构造上万的协程如果是抢占式那么就会在切换任务时保存当前的上下文环境因为当前线程如果正在做一件事做到一半我们就强制停止这时我们就必须多保存很多信息避免再次切换回来时任务出错。线程是操作系统层面的多任务而go的协程属于编译器层面的多任务go有自己的调度器来调度。一个协程在哪个线程上是不确定的这个是由调度器来决定的多个协程可能在一个或多个线程上运行。go的并发是很重要的这里只是简单说一下MPG模型的个人理解如果大家有不同意见可以一起讨论学习三人行必有我师。如果觉得这篇文章不错可以转发微信公众号/今日头条Go语言之美更多go语言知识信息等。