• go runtime.Gosched() 和 time.Sleep() 做协程切换


       网上看到个问题:

      

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func say(s string) {
        for i := 0; i < 5; i++ {
            time.Sleep(100 * time.Millisecond)
            fmt.Println(s)
        }
    }
    
    func main() {
        go say("world")
        say("hello")
    }

    只有使用time.sleep(100 * time.Millisecond) 时才会连续打出5个hello world 

    解释是 go 是非抢占的,只有出让cpu时,另外一个协程才会运行。如果没有time.sleep(100 * time.Millisecond)就只会打出5个hello出来。

    还有另外一个协程切换的方式:

    package main
    
    import (
        "fmt"
      "runtime"
    )
    
    func say(s string) {
        for i := 0; i < 5; i++ {
        runtime.Gosched()

            fmt.Println(s)

        }
    }
    
    func main() {
        go say("world")
        say("hello")
    }

    这个只是打出了5 个hello 4个world ----原因不明。

    比对了下 Gosched() 和 Sleep() 两者运行的时候系统的情况:

    package main
    
    import (
    //    "fmt"
        "runtime"
    //    "time"
    )
    
    func say(){
        for i := 0; i < 10000000; i++{
    //        time.Sleep(1 * time.Millisecond)
        runtime.Gosched()
    //        fmt.Println(s)
        }
    }
    
    func main(){
        go say()
        say()
    }

    发现cpu使用率在使用Gosched() 时 比 Sleep() 要高,但是运行的时间比Sleep()的方式明显要短一些。---这里面切换的方式需要在网上找找有没有资料了.

    相关:

    http://stackoverflow.com/questions/15771232/why-is-time-sleep-required-to-run-certain-goroutines

  • 相关阅读:
    宋元
    隋唐
    中国历史上三次大分裂时期
    三国
    PCL点云 no override found for 'vtkActor'.
    PCL 点云欧式聚类
    PCL区域生长分割
    OPENCV 求轮廓方向
    pcl点云的创建、访问与转换
    PCL 圆柱模型和平面模型的分割
  • 原文地址:https://www.cnblogs.com/edenpans/p/5893451.html
Copyright © 2020-2023  润新知