其他分享
首页 > 其他分享> > runtime标准库

runtime标准库

作者:互联网

runtime标准库

runtime包提供和go运行时环境的互操作,如控制goroutine的函数。

它也包括用于reflect包的低层次类型信息。

1. 环境变量

gctrace 每一行打印的日志格式如下:

gc {0} @{1}s {2}%: {3}+...+{4} ms clock, {5}+...+{6} ms cpu, {7}->{8}->{9} MB, {10} MB goal, {11} P

每一个变量的具体定义:

下面是一块存在内存泄露的代码段:

package main

import (
    "os"
    "os/signal"
)

func main() {
    go func() {
        m := make(map[int]int)
        for i := 0; ; i++ {
            m[i] = i
        }
    }()

    sig := make(chan os.Signal, 1)
    signal.Notify(sig)
    <-sig

}

执行 GODEBUG=gctrace=1 go run main.go, 查看运行时的内存情况:

可以看到程序在运行过程中, 每次 GC,堆内存都在不断增大, 这是一个很明显的内存泄露场景。

2. runtime.Gosched

让出CPU时间片,重新等待安排任务

package main
 
import (
    "fmt"
    "runtime"
)
 
func main() {
    go func(s string) {
        for i :=0; i < 2; i++ {
            fmt.Println(s)
            runtime.Gosched()  // 让出CPU时间片,重新等带安排任务
        }
    }("world")
 
    for i := 0; i < 2; i++ {
        fmt.Println("hello")
        runtime.Gosched()  // 让出CPU时间片,重新等待安排任务
    }
}

3. runtime.Goexit

退出当前协程

package main
 
import (
    "fmt"
    "runtime"
    "sync"
)
 
var wg sync.WaitGroup
 
func main() {
    wg.Add(1)
    go func() {
        defer wg.Done()
        defer fmt.Println("A.defer")
        func() {
            defer fmt.Println("B.defer")
            // 结束协程
            runtime.Goexit()
            defer fmt.Println("C.defer")
            fmt.Println("B")
        }()
        fmt.Println("A")
    }()
 
    wg.Wait()  // 主goroutine等待子goroutine结束,主在结束
}

4. runtime.GOMAXPROCS

Go运行时调度器使用runtime.GOMAXPROCS参数来确定需要使用多少个os线程来同时执行go代码,
默认值是机器上的CPU核心数量,例如一个8核心的机器上,调度器会把go代码同时调度到8个os线程上

go语言中可以通过runtime.GOMAXPROCS()函数来设置当前程序并发时占用的CPU逻辑核心数
go1.5版本之前默认使用的是单核心执行,1.5之后默认使用全部的cpu逻辑核心数

我们可以通过将任务分配到不同的CPU逻辑核心上,从而实现并行的效果 :

package main
 
import (
    "fmt"
    "runtime"
    "sync"
    "time"
)
 
var wg sync.WaitGroup
 
func a() {
    defer wg.Done()
    for i := 0; i < 100000000; i++ {
        //fmt.Println("A", i)
    }
}
func b() {
    defer wg.Done()
    for i := 0; i < 100000000; i++ {
        //fmt.Println("B", i)
    }
}
 
func main() {
    startTime := time.Now()
    //runtime.GOMAXPROCS(1)  // 设置go运行时(runtime)的os线程数
    // runtime.GOMAXPROCS设置为1os线程数时执行时间要比4os线程数用时更长
    runtime.GOMAXPROCS(4)  // 设置go运行时(runtime)的os线程数
    wg.Add(1)
    go a()
    wg.Add(1)
    go b()
    wg.Add(1)
    go a()
    wg.Add(1)
    go b()
 
    wg.Wait()
    fmt.Println(time.Now().Sub(startTime))
 
}

5. runtime.NumCPU

返回当前系统的 CPU 核数量

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

6. runtime.GOOS

目标操作系统

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

标签:wg,main,fmt,标准,func,go,runtime
来源: https://www.cnblogs.com/ppku/p/16697456.html