服务器之家

服务器之家 > 正文

Golang中runtime的使用详解

时间:2020-05-27 10:35     来源/作者:田飞雨

runtime 调度器是个非常有用的东西,关于 runtime 包几个方法:

  • Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行
  • NumCPU:返回当前系统的 CPU 核数量
  • GOMAXPROCS:设置最大的可同时使用的 CPU 核数
  • Goexit:退出当前 goroutine(但是defer语句会照常执行)
  • NumGoroutine:返回正在执行和排队的任务总数
  • GOOS:目标操作系统

NumCPU

?
1
2
3
4
5
6
7
8
9
10
11
12
package main
 
import (
  "fmt"
  "runtime"
)
 
func main() {
  fmt.Println("cpus:", runtime.NumCPU())
  fmt.Println("goroot:", runtime.GOROOT())
  fmt.Println("archive:", runtime.GOOS)
}

运行结果:

Golang中runtime的使用详解

GOMAXPROCS

Golang 默认所有任务都运行在一个 cpu 核里,如果要在 goroutine 中使用多核,可以使用 runtime.GOMAXPROCS 函数修改,当参数小于 1 时使用默认值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
 
import (
  "fmt"
  "runtime"
)
 
func init() {
  runtime.GOMAXPROCS(1)
}
 
func main() {
  // 任务逻辑...
 
}

Gosched

这个函数的作用是让当前 goroutine 让出 CPU,当一个 goroutine 发生阻塞,Go 会自动地把与该 goroutine 处于同一系统线程的其他 goroutine 转移到另一个系统线程上去,以使这些 goroutine 不阻塞

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
 
import (
  "fmt"
  "runtime"
)
 
func init() {
  runtime.GOMAXPROCS(1) //使用单核
}
 
func main() {
  exit := make(chan int)
  go func() {
    defer close(exit)
    go func() {
      fmt.Println("b")
    }()
  }()
 
  for i := 0; i < 4; i++ {
    fmt.Println("a:", i)
 
    if i == 1 {
      runtime.Gosched() //切换任务
    }
  }
  <-exit
 
}

结果:

Golang中runtime的使用详解

使用多核测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
 
import (
  "fmt"
  "runtime"
)
 
func init() {
  runtime.GOMAXPROCS(4) //使用多核
}
 
func main() {
  exit := make(chan int)
  go func() {
    defer close(exit)
    go func() {
      fmt.Println("b")
    }()
  }()
 
  for i := 0; i < 4; i++ {
    fmt.Println("a:", i)
 
    if i == 1 {
      runtime.Gosched() //切换任务
    }
  }
  <-exit
 
}

结果:

Golang中runtime的使用详解

根据你机器来设定运行时的核数,但是运行结果不一定与上面相同,或者在 main 函数的最后加上 select{} 让程序阻塞,则结果如下:

Golang中runtime的使用详解

多核比较适合那种 CPU 密集型程序,如果是 IO 密集型使用多核会增加 CPU 切换的成本。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.jianshu.com/p/e45cea3e1723

标签:

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部