Golang在runtime包里原来也有协程相关的api呀 | 青训营笔记

163 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记

😆在这里,我对今天的课所新学到的Golang在runtime包里的协程相关的api做了一次总结

😜Golang的其他知识在哪里找呢,那你就问对了

👨‍💻Golang基础复习 - 掘金 (juejin.cn) 在这里我总结了一些这篇文章没有提到的一些知识

😊如果有小伙伴能想到更多知识,欢迎大家在评论区留言,那么我们就开始吧

👩‍💻👨‍💻哟西,一个棕~

😎😎😎我是小小分割线

golang并发编程中在runtime这个包里也定义了一些协程管理相关的api

我们来简单的看一下

首先是

runtime.Gosched()

这一个api可以使让CPU让出时间片,重新等待安排任务

也就是将当前的CPU让出来,让其他协程去执行

我们来看一下使如何使用的

func main() {
   // 开启一个协程
   go show("show协程")

   // 此处是主协程
   for i := 0; i < 2; i++ {
      // 在主协程中,我们调用api
      runtime.Gosched()
      // 也就是,每次到这里时都把cpu让出来给其他子协程

      // 打印
      fmt.Println("主协程")
   }
}

// 这个函数用来打印两次参数
func show(str string) {
   for i := 0; i < 2; i++ {
      fmt.Println(str)
   }
}

此时打印:

show协程

show协程

主协程

主协程

由于每次主协程打印前都会让出CPU,所以子协程一定比主协程先打印


我们来看runtime包里的另一个api

runtime.Goexit()

用来退出当前的协程

我们来试一下

func main() {
   // 开启一个协程
   go show("show协程")

   // 此处是主协程
   for i := 0; i < 2; i++ {
      // 在主协程中,我们调用api
      runtime.Gosched()
      // 也就是,每次到这里时都把cpu让出来给子协程

      // 打印
      fmt.Println("主协程")
   }
}

// 这个函数用来打印5次参数
// 但是在第3次退出
func show(str string) {
   for i := 0; i < 5; i++ {
      if i == 3 {
         // 调用api退出
         runtime.Goexit()
      }
      fmt.Println(str)
   }
}

此时打印:

show协程

show协程

show协程

主协程

主协程


我们再来介绍一个相关的api

runtime.GoMAXPROCS

可以用来设置我们的最大核心数

我们可以使用runtime.NumCPU()得到我们当前的核心数

设置语法

runtime.GoMAXPROCS(数值)

如果多核我们是可以交替执行的,但是单核的情况下,而且没有睡眠等让出CPU的控制权的操作的情况下,是不会交替执行的

我们可以用代码来实现一下

func a() {
   for i := 0; i < 10; i++ {
      fmt.Println("a => ", i)
   }
}

func b() {
   for i := 0; i < 10; i++ {
      fmt.Println("b => ", i)
   }
}

func main() {
   // 打印现在的核心数
   fmt.Println("现在核心数为 => ", runtime.NumCPU())

   // 修改后runtime.NumCPU()不会发生改变
   // 但是使用的最大核心数会发生改变
   runtime.GOMAXPROCS(1)

   go a()

   go b()

   // 睡两秒,防止主协程先死亡,啥都看不到
   time.Sleep(time.Second * 2)
}

此时打印为

现在核心数为 =>  16
b =>  0
b =>  1
b =>  2
b =>  3
b =>  4
a =>  0
a =>  1
a =>  2
a =>  3
a =>  4

此时最大可用核心数为1个,两个协程谁先抢到就会先一直执行下去,不会发生交替执行


有关以上呢,我们就是介绍了一下在Golang的runtime包里的这些和我们的协程相关的api

😎😎😎又是我,我还是小小分割线

都用心看到这里了,那就求个赞吧😘

🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好