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
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值