gosched
Posted hualou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gosched相关的知识,希望对你有一定的参考价值。
Go语言runtime.Gosched()函数浅析
这个函数的作用是让当前goroutine
让出CPU
,好让其它的goroutine
获得执行的机会。同时,当前的goroutine
也会在未来的某个时间点继续运行。
请看下面这个例子(show.go
):
package main
import (
"fmt"
)
func showNumber (i int) {
fmt.Println(i)
}
func main() {
for i := 0; i < 10; i++ {
go showNumber(i)
}
fmt.Println("Haha")
}
执行结果如下:
[root@Fedora goEx]# go build show.go
[root@Fedora goEx]# ./show
Haha
没有打印出数字,可以看到goroutine
没有获得机会运行。
修改代码:在main
函数中加上runtime.Gosched()
:
package main
import (
"fmt"
"runtime"
)
func showNumber (i int) {
fmt.Println(i)
}
func main() {
for i := 0; i < 10; i++ {
go showNumber(i)
}
runtime.Gosched() //GoSched虽然让出cpu使用权,但是依然会被调度,在执行很长一段时间后有机会刚好获得cpu使用权,不一定等到所有其他go程执行完了才执行,它出让cpu的量级比sleep小的多,因为cpu的调度是随机的
fmt.Println("Haha")
}
编译运行:
[root@Fedora goEx]# go build show.go
[root@Fedora goEx]# ./show
0
1
2
3
4
5
6
7
8
9
Haha
可以看到goroutine
获得了运行机会,打印出了数字。
以上是关于gosched的主要内容,如果未能解决你的问题,请参考以下文章
go runtime.Gosched() 和 time.Sleep() 做协程切换
Golang中的GoschedGoexitGOMAXPROCS