Go 协程权限调度包runtime

作者: 太阳上的雨天 分类: Go 发布时间: 2022-03-20 13:25

runtime里的三个函数Gosched、Goexit、GOMAXPROCS

Gosched:让出cpu时间切片。用于让出当前grouting的执行权限,调度器安排其他等待的goroutine执行任务,并在某个位置恢复执行

Goexit:终止当前的goroutine执行,并不会影响其他的goroutine执行。并在终止当前的goroutine之前,执行还未执行的defery语句. 如果Goexit在main函数中执行会报panic

GOMAXPROCS: 用来设置可以并行计算的CPU核数最大值,并返回之前的值。 1~256 最好在主函数之前设置,否则会终止当前的任务执行

Go 默认是一个cpu核的,可以通过GOMAXPROCS来设置

Gosched:

不加Gosched, 子协程并不会打印出来

func main() {
  // 子协程
    go func() {
        for i := 0; i < 2; i++ {
            fmt.Println("会打印吗")
        }
    }()

    // 主协程
    for i := 0; i < 2; i++ {
        fmt.Println("我会打印!!!!")
    } 
}

结果:

我会打印!!!!
我会打印!!!!

加Gosched, 子协程就可以打印出来

func main() {
    go func() {
        for i := 0; i < 2; i++ {
            fmt.Println("会打印吗")
        }
    }()

    // 主协程
    for i := 0; i < 2; i++ {
        runtime.Gosched()
        fmt.Println("我会打印!!!!")
    }
}

结果:

会打印吗
会打印吗
我会打印!!!!
我会打印!!!!

Goexit:

func test() {
    defer fmt.Println("还未执行的defer语句")
    runtime.Goexit()
    fmt.Println("这条信息还能打印吗????")
}

func main() {
  // 子协程
    go func() {
        fmt.Println("哈哈哈哈哈哈哈")
        test()
        fmt.Println("来打我呀!!!!!")
    }()

  // 死循环,为了不让主协程退出
    for {

    }
}

结果:

哈哈哈哈哈哈哈
还未执行的defer语句

GOMAXPROCS:

func main() {

    runtime.GOMAXPROCS(2)

    for {
        go fmt.Println("go")
        fmt.Print(0)
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注