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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM