在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
转自:https://studygolang.com/articles/2511 十分感谢这位大牛的总结
之前对golang的goroutine机制和runtime.GOMAXPROCS不是很理解,今天抽空研究了一下,学习了其他大牛的文章。把自己的理解写下来。如有错误,请指正 golang的goroutine机制有点像线程池: 我们用如下图分别表示P、M、G
在单核情况下,所有goroutine运行在同一个线程(M0)中,每一个线程维护一个上下文(P),任何时刻,一个上下文中只有一个goroutine,其他goroutine在runqueue中等待。一个goroutine运行完自己的时间片后,让出上下文,自己回到runqueue中(如下图左边所示)。 当正在运行的G0阻塞的时候(可以需要IO),会再创建一个线程(M1),P转到新的线程中去运行。 当M0返回时,它会尝试从其他线程中“偷”一个上下文过来,如果没有偷到,会把goroutine放到global runqueue中去,然后把自己放入线程缓存中。上下文会定时检查global runqueue。
-------------------------------- 分割线 ---------------------------------------------
GO默认是使用一个CPU核的,除非设置runtime.GOMAXPROCS 那么在多核环境下,什么情况下设置runtime.GOMAXPROCS会比较好的提高速度呢? 适合于CPU密集型、并行度比较高的情景。如果是IO密集型,CPU之间的切换也会带来性能的损失。 |
请发表评论