golang 并发问题
如何使用channel实现定时器?
使用channel的阻塞,里面放一个sleep就可以了
Go语言——goroutine并发模型:
视频地址:
https://www.bilibili.com/video/BV1ji4y1M7a8?p=10
相关文章:
https://studygolang.com/articles/9610
https://www.jianshu.com/p/f9024e250ac6
操作系统对物理级别的调度效率很低下,所以go要自己写一个调度器,目的是让go的并发效率更高.
go的用的是多对多的调度模型.多个用户线程(就是go里的协程),多个逻辑协程同时挂载到多个物理线程上面.
M:N M表示的是协程数(逻辑态的),N表示的是线程数(物理态的)
Go的调度器使用了三种结构:M,P,G
M代表内核线程
P代表操作系统的处理器,比如说是四核双线程,8个逻辑处理器,每个处理器代表一个上下文(即这里的P).这个处理器的下面挂的所有的协程可以共享它的cpu和内存.
G代表协程.
一个物理态的线程(M)跑在一个cpu内核(P)的上面(cpu即称为上下文)
一个M下面最多可以挂256个协程(G)(1.10版本的编译器)
c和java是千级的物理态的线行并发,可以调用1024个进程(M)
go号称有百万级并发,所以可以调用一百万个协程(G) ,10的6次方
G0如果叫了GC垃圾回收,垃圾要保证同步的,不能并发的,操作系统就会把G0的这条进线M给锁起来了,这个M就会带着这个G0,去垃圾回收了,它下面的p就会带着它下面的局部队列里所有的协程(G)挂到别的空闲的进程(M)上去执行,如果G0的垃圾回收完后,操作系统就会给这个G0找一个别的P下的队上去,如果全满了,就挂到全局的队列上.如果某个p下的局部队列执行完了,就会去全局队列里取协程G回来执行.所有的p再执行时,也会定时去检查全局队列上有没有协程(G),有的话就拿回来挂到自己的队列上执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构