Go 协程权限调度包runtime

518 次浏览次阅读
没有评论

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)
    }
}
正文完
 0
评论(没有评论)