網上看到個問題:
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