Go语言runtime.Gosched()函数的官方文档如下:

Gosched yields the processor, allowing other goroutines to run. It
does not suspend the current goroutine, so execution resumes
automatically.

它的作用是让当前goroutine让出CPU,让其它的goroutine获得执行的机会。
例子:

package main
import (
    "fmt"
    "runtime"
)
 
func say(s string) {
    for i := 0; i < 2; i++ {
        fmt.Printf("%s第%d次循环-before\n",s,i)
        runtime.Gosched()
        fmt.Printf("%s第%d次循环-print\n",s,i)
    }
}
 
func main() {
    go say("world")
    go say("golang")
    say("hello")
}

编译之后结果如下:

hello第0次循环-before
world第0次循环-before
golang第0次循环-before
world第0次循环-print
world第1次循环-before
golang第0次循环-print
golang第1次循环-before
hello第0次循环-print
hello第1次循环-before
world第1次循环-print
golang第1次循环-print
hello第1次循环-print

分析

默认情况goroutins都是在一个线程里执行的,多个goroutins之间轮流执行,当一个goroutine发生阻塞,Go会自动地把与该goroutine处于线程的其他goroutines转移到另一个线程上去,以使这些goroutines不阻塞。通过上面的结果可以看出,主线程执行完毕之后程序就退出了。
最后,如果代码中通过 runtime.GOMAXPROCS(n) 其中n是整数,指定使用多核的话,多个goroutines之间就可以实现真正的并行,结果就会上面的有所不同。

runtime包

runtime包中有几个处理goroutine的函数:
Goexit:退出当前执行的goroutine,但是defer函数还会继续调用
Gosched:让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。
NumCPU:返回 CPU 核数量
NumGoroutine:返回正在执行和排队的任务总数
GOMAXPROCS:用来设置可以并行计算的CPU核数的最大值,并返回之前的值。

标签: none

添加新评论