Go语言入门13之runtime包案例讲解
作者:te9uila
这篇文章主要介绍了Go语言入门runtime包相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Runtime包
GOMAXPROCS()
用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述
Gosched()
用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行
Goexit()
用于立即中止当前goroutine的运行(中止所在协程),而并不影响其他goroutine。⭐注意!Goexit()在中止当前协程前,还是会运行当前goroutine还没有执行的defer语句,切记,不允许在主函数调用Goexit(),会导致panic异常
runtime调度器是非常有用的东西,关于runtime包几个方法:
Gosched:让当前线程让出cpu以让其他线程运行,它不会挂起当前线程,因此当前线程未来会继续执行
NumCPU:返回当前系统的CPU核数量
GOMAXPROCS:设置最大的可同时使用的CPU核数
Goexit:退出当前goroutine(但是defer语句会照常执行)
NumGoroutine:返回真该执行和排队的任务总数
GOOS:目标操作系统
- GOROOT:返回本机的GO路径
举个栗子
// 定义两个函数,Test01和Test02 // Test02在Test01运行结束之后运行 // 并且Test02在i = 3的时候结束运行 //Test01 func Test01(wg *sync.WaitGroup) { defer func() { fmt.Println("Test01结束!") wg.Done() }() fmt.Println("协程01循环输出:") for i := 0; i < 5; i++ { fmt.Println("协程01 -", i) } } // Test02 func Test02(wg *sync.WaitGroup) { defer func() { fmt.Println("Test02结束!") wg.Done() }() // 等待Test01运行结束 runtime.Gosched() fmt.Println("协程02循环输出:") for i := 0; i < 5; i++ { if i == 3 { fmt.Println("i = 3 退出!") // 当i = 3时执行defer里的语句然后退出 runtime.Goexit() } fmt.Println("协程02 -", i) } } // main函数调用 func main() { var wg sync.WaitGroup wg.Add(2) go Test01(&wg) go Test02(&wg) wg.Wait() fmt.Println("This is main function!") } /*输出: 协程01循环输出: 协程01 - 0 协程01 - 1 协程01 - 2 协程01 - 3 协程01 - 4 Test01结束! 协程02循环输出: 协程02 - 0 协程02 - 1 协程02 - 2 i = 3 退出! Test02结束! This is main function! */
到此这篇关于Go语言入门13(runtime包)的文章就介绍到这了,更多相关Go runtime包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!