go-goroutine协程及多核调度


title: go-goroutine协程及多核调度
categories: Go
tags: [go, goroutine, 协程, 调度]
date: 2020-11-21 14:25:12
comments: false
mathjax: true
toc: true

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() 函数进行设置,例如:

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/

猜你喜欢

转载自blog.csdn.net/yangxuan0261/article/details/110238712
今日推荐