• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang中runtime的使用详解

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

    NumCPU

    package main
    
    import (
      "fmt"
      "runtime"
    )
    
    func main() {
      fmt.Println("cpus:", runtime.NumCPU())
      fmt.Println("goroot:", runtime.GOROOT())
      fmt.Println("archive:", runtime.GOOS)
    }
    
    

    运行结果:

    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
    
    }
    
    

    结果:

    使用多核测试:

    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
    
    }
    
    

    结果:

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

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

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

    您可能感兴趣的文章:
    • 如何判断Golang接口是否实现的操作
    • 浅谈golang中的&^位清空操作
    • Golang之defer 延迟调用操作
    • 解决golang sync.Wait()不执行的问题
    • golang执行命令操作 exec.Command
    • golang等待触发事件的实例
    • 对Golang中的runtime.Caller使用说明
    上一篇:golang日志框架之logrus的使用
    下一篇:解决vscode中golang插件依赖安装失败问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang中runtime的使用详解 Golang,中,runtime,的,使用,