本文主要是介绍Golang进程权限调度包runtime,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于 runtime 包几个方法:
- Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行
- GOMAXPROCS:设置最大的可同时使用的 CPU 核数
- Goexit:退出当前 goroutine(但是defer语句会照常执行)
- NumGoroutine:返回正在执行和排队的任务总数
- GOOS:目标操作系统
- NumCPU:返回当前系统的 CPU 核数量
package mainimport ("fmt""runtime"
)func main() {fmt.Println("cpus:", runtime.NumCPU())fmt.Println("goroot:", runtime.GOROOT())fmt.Println("archive:", runtime.GOOS)
}
runtime.Gosched()
用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其它等待的任务运行,并在下次某个时候从该位置恢复执行。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。
没有使用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
runtime.Goexit()
调用此函数会立即使当前的goroutine的运行终止(终止协程),而其它的goroutine并不会受此影响。runtime.Goexit在终止当前goroutine前会先执行此goroutine的还未执行的defer语句。请注意千万别在主函数调用runtime.Goexit,因为会引发panic。
package mainimport ("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 {}
}
aaaaaaaaaaaaaaaaaa
ccccccccccccc
runtime.GOMAXPROCS()
用来设置可以并行计算的CPU核数最大值,并返回之前的值。
默认此函数的值与CPU逻辑个数相同,即有多少个goroutine并发执行,当然可以设置它,它的取值是1~256。最好在主函数在开始前设置它,因为设置它会停止当前程序的运行。
GO默认是使用一个CPU核的,除非设置runtime.GOMAXPROCS
那么在多核环境下,什么情况下设置runtime.GOMAXPROCS会比较好的提高速度呢?
适合于CPU密集型、并行度比较高的情景。如果是IO密集型,CPU之间的切换也会带来性能的损失。
package mainimport ("fmt""runtime"
)func main() {//n := runtime.GOMAXPROCS(1) //指定以1核运算n := runtime.GOMAXPROCS(4) //指定以4核运算fmt.Println("n = ", n)for {go fmt.Print(1)fmt.Print(0)}
}
参考地址:Golang进程权限调度包runtime三大函数Gosched、Goexit、GOMAXPROCS
这篇关于Golang进程权限调度包runtime的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!