天天看点

golang中的runtime

Gosched

runtime.Gosched()让出cpu的时间片,让出当前协程的执行权限,调度器安排其他等待的任务运行,并在下次某个时间从该位置恢复执行

和协程 yield 作用类似

func main() {
   go func() {
      for i := 0; i < 5; i++ {
         //不一定打印5次
         fmt.Println("go")
      }
   }()    //别忘记()

   for i := 0; i < 2; i++ {
      //让出我的时间片
      runtime.Gosched()
      fmt.Println("hello")
   }
}
           

Goexit

调用runtime.Goexit()将立即终止当前协程运行,调度器确保所有已注册defer延迟调用执行

有时候我们会遇到这个问题

调度器确保所有已注册defer延迟调用被执行,要在Goexit之前注册

func test()  {
   defer fmt.Println("test-------")

   return //终止使用此函数
   fmt.Println("1111111111")
}

func main() {
   go func() {
      fmt.Println("aaaa")

      //调用了别的函数
      test()
      //没打印
      fmt.Println("bbb")
   }()    //别忘记()

   for {

   }

}
           

输出

aaaa
test-------
bbb
           
func test() {
   defer fmt.Println("test-------")
   //终止这个协程
   runtime.Goexit()
   //return
   fmt.Println("1111111111")
}

func main() {
   go func() {
      fmt.Println("aaaa")

      //调用了别的函数
      test()
      //没打印
      fmt.Println("bbb")
   }() //别忘记()

   for {

   }

}
           
aaaa
test-------
           

GOMAXPROCS

调用runtime.GOMAXPROCS()用来设置可以并行计算的cpu核数的最大值,并返回之前的值

func main() {
   //指定核数
   n := runtime.GOMAXPROCS(2)
   fmt.Println(n)
}
           

多任务资源竞争

//定义一个打印机
//打印机属于公共资源
func Printer(str string) {
   for _, data := range str{
      fmt.Printf("%c", data)
      time.Sleep(time.Second)
   }
   fmt.Printf("\n")
}

func Person1()  {
   Printer("hello")
}

func Person2()  {
   Printer("world")
}

func main() {
   //新建2个协程,代表2个人,2个人同时使用打印机
   go Person1()
   go Person2()

   //特意不让主协程结束,死循环
   for {

   }

}
           

打印会乱掉

我们如何让他同步呢

其他的小功能

返回go的根目录,存在GOROOT环境变量返回该环境变量,不存在返回go的根目录

func GOROOT() string
           

版本

func Version() string
           

cpu个数

func NumCPU() int
           

GC

func GC()
           

查看时间

go build main.go 

time -p ./main

           
0 9223372030412324865
1 9223372030412324865
real 1.92	 // 程序开始到结束时间差 (  CPU 时间)
user 3.80	// 用户态所使用 CPU 时间片 (多核累加) 
sys 0.01	// 内核态所使用 CPU 时间片

           
GOMAXPROCS=8 time -p ./main

           
1 9223372030412324865
0 9223372030412324865
real         1.89
user         3.76	// 虽然总时间差不多,但由 2 个核并行,real 时间自然少了许多。 
sys          0.00