Golang进程权限调度包runtime三大函数Gosched、Goexit、GOMAXPROCS
-
runtime.Gosched(),用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其它等待的任务运行,并在下次某个时候从该位置恢复执行。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。
-
runtime.Goexit(),调用此函数会立即使当前的goroutine的运行终止(终止协程),而其它的goroutine并不会受此影响。runtime.Goexit在终止当前goroutine前会先执行此goroutine的还未执行的defer语句。请注意千万别在主函数调用runtime.Goexit,因为会引发panic。
-
runtime.GOMAXPROCS(),用来设置可以并行计算的CPU核数最大值,并返回之前的值。
Gosched()代码案例:
- 没有使用Gosched函数
package main
import (
"fmt"
)
func main() {
go func() { //子协程 //没来的及执行主进程结束
for i := 0; i < 5; i++ {
fmt.Println("go")
}
}()
for i := 0; i < 2; i++ { //默认先执行主进程主进程执行完毕
fmt.Println("hello")
}
}
hello
hello
- 使用Gosched函数
package main
import (
"fmt"
"runtime"
)
func main() {
go func() { //让子协程先执行
for i := 0; i < 5; i++ {
fmt.Println("go")
}
}()
for i := 0; i < 2; i++ {
//让出时间片,先让别的协议执行,它执行完,再回来执行此协程
runtime.Gosched()
fmt.Println("hello")
}
}
go
go
go
go
go
hello
hello
- Goexit()代码案例
package main
import (
"fmt"
"runtime"
)
func test() {
defer fmt.Println("ccccccccccccc")
//return //终止此函数
runtime.Goexit() //终止所在的协程
fmt.Println("dddddddddddddddddddddd")
}
func main() {
//创建新建的协程
go func() {
fmt.Println("aaaaaaaaaaaaaaaaaa")
//调用了别的函数
test()
fmt.Println("bbbbbbbbbbbbbbbbbbb")
}() //别忘了()
//特地写一个死循环,目的不让主协程结束
for {
}
}