go-goroutine协程及多核调度
go-goroutine协程及多核调度
前篇
- 万字长文深入浅出 Golang Runtime版本演进、调度、内存及实践 - https://www.toutiao.com/i6855166544079487492/
- Golang的协程调度器原理及GMP设计思想? - https://www.toutiao.com/i6797580089891488259/
go func() 调度流程
golang 多核调度 及 goroutine 协程
参考:
- 对golang多核编程的一点了解 - https://studygolang.com/articles/9686
- Go语言中的多核调度 - https://blog.csdn.net/InsZVA/article/details/54081605
- Golang 的 协程调度机制 与 GOMAXPROCS 性能调优 - https://juejin.im/post/5b7678f451882533110e8948
- Golang的协程调度器原理及GMP设计思想 - https://www.toutiao.com/i6797580089891488259/
GOMAXPROCS
在 Go语言程序运行时(runtime)实现了一个小型的任务调度器。这套调度器的工作原理类似于操作系统调度线程,Go 程序调度器可以高效地将 CPU 资源分配给每一个任务。传统逻辑中,开发者需要维护线程池中线程与 CPU 核心数量的对应关系。同样的,Go 地中也可以通过 runtime.GOMAXPROCS() 函数做到,格式为:
runtime.GOMAXPROCS(逻辑CPU数量)
这里的逻辑CPU数量可以有如下几种数值:
- <1:不修改任何数值。
- =1:单核心执行。
- >1:多核并发执行。
一般情况下,可以使用 runtime.NumCPU() 查询 CPU 数量,并使用 runtime.GOMAXPROCS() 函数进行设置,例如:
1 | runtime.GOMAXPROCS(runtime.NumCPU()) |
Go 1.5 版本之前,默认使用的是单核心执行。从 Go 1.5 版本开始,默认执行上面语句以便让代码并发执行,最大效率地利用 CPU。
GOMAXPROCS 同时也是一个环境变量,在应用程序启动前设置环境变量也可以起到相同的作用。
抢占
- 抢占:在coroutine中要等待一个协程主动让出CPU才执行下一个协程,在Go中,一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死,这就是goroutine不同于coroutine的一个地方。 - https://www.toutiao.com/i6797580089891488259/
goroutine 协程
相关资料
- 万字长文深入浅出 Golang Runtime版本演进、调度、内存及实践 - https://www.toutiao.com/i6855166544079487492/
切换协程
- 用户代码中的协程懂不造成的阻塞, 仅仅是切换协程, 而不阻塞线程. - https://www.toutiao.com/i6855166544079487492/