首页 > 代码库 > go runtime.Gosched() 和 time.Sleep() 做协程切换
go runtime.Gosched() 和 time.Sleep() 做协程切换
网上看到个问题:
package mainimport ( "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 mainimport ( "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 mainimport (// "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
go runtime.Gosched() 和 time.Sleep() 做协程切换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。