go语言开启线程 golang 进程 线程 协程( 二 )


当一个os线程在执行M1一个G1发生阻塞时,调度器让M1抛弃P,等待G1返回,然后另起一个M2接收P来执行剩下的goroutine队列(G2、G3...),这是golang调度器厉害的地方,可以保证有足够的线程来运行剩下所有的goroutine 。
当G1结束后,M1会重新拿回P来完成,如果拿不到就丢到全局runqueue中,然后自己放到线程池或转入休眠状态 。空闲的上下文P会周期性的检查全局runqueue上的goroutine,并且执行它 。
另一种情况就是当有些P1太闲而其他P2很忙碌的时候,会从其他上下文P2拿一些G来执行 。
详细可以翻看下方第一个参考链接,写得真好 。
最后用大佬的总结来做最后的收尾————
Go语言运行时,通过核心元素G,M , P 和 自己的调度器,实现了自己的并发线程模型 。调度器通过对G,M , P的调度实现了两级线程模型中操作系统内核之外的调度任务 。整个调度过程中会在多种时机去触发最核心的步骤 “一整轮调度”,而一整轮调度中最关键的部分在“全力查找可运行G”,它保证了M的高效运行(换句话说就是充分使用了计算机的物理资源),一整轮调度中还会涉及到M的启用停止 。最后别忘了,还有一个与Go程序生命周期相同的系统监测任务来进行一些辅助性的工作 。
浅析Golang的线程模型与调度器
Golang CSP并发模型
Golang线程模型
golang多线程简单逻辑实现指定个核心最大化使用,比如核心总数减一 。
必要的库 。
要使用的cpu数量,建议不全使用 。
建立管道 。
声明使用的cpu数 。
建立互斥关系,本例中主要为了实现所有线程执行完后再执行后续程序 。
创建cpu数减1个线程
后面每个任务结束时要done一个wg,这里根据具体情况加,是循环就在每个循环里加,保证后面能全部done即可
没有缓冲的、阻塞式的往管道传递字符串 。
Wait是等所有线程都执行完,即增加的数字被全done掉 。
关闭管道 。
假设已有的函数是ReadLogs,在它的基础上加个Wg加函数名的新函数,我觉得这种方式不改变原有的,比较舒服 。
大意是:循环从管道读取字符串 , 读不到了就跳出循环 。
每个ReadLogs()之后加一个wg.Done(),相当于计数减一 。
ReadLogs()就是要执行的任务,不再解释 。
就是开指定个线程 。
管道阻塞传值 。
wg同步 。
WgReadLogs循环接收 。
关于go语言开启线程和golang 进程 线程 协程的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读