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获得了运行机会,打印出了数字。





原文地址:https://www.cnblogs.com/hualou/p/12069997.html