欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Golang中runtime的使用详解

程序员文章站 2022-05-14 15:20:33
runtime 调度器是个非常有用的东西,关于 runtime 包几个方法: gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当...

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

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

numcpu

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 时使用默认值。

package main

import (
  "fmt"
  "runtime"
)

func init() {
  runtime.gomaxprocs(1)
}

func main() {
  // 任务逻辑...

}

gosched

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

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的使用详解

使用多核测试:

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 切换的成本。

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