这是我参与「第三届青训营 -后端场」笔记创作活动的的第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
😎😎😎又是我,我还是小小分割线
都用心看到这里了,那就求个赞吧😘
🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好