关于是否主动交出控制权
来源:10-1 goroutine

满满回忆录
2020-07-24
func main() {
var a [10]int
for i := 0; i < 10; i++ {
go func(i int) {
for {
// 这是一个io的操作,只要是io,就会有等待的过程
//fmt.Printf("hello form goroutine %d\n", i)
// 为了不产生io,不会产生协程切换,协程就不会主动
a[i]++
// 主动交出控制权,不过在1.13版本以及之前的版本才需要,1.14就不再需要了
//runtime.Gosched()
}
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println(a)
fmt.Println("exit")
}
是否主动交出的区别在于
1、主动交出控制,[429 437 380 329 245 282 318 343 293 320], 值很小,说明运行次数不过
2、不主动交出控制权,[1594066 1960556 2016022 1655492 1412227 2435271 2012978 0 0 3796643],值很大,说明运行的效率非常高
请问我的理解对吗
写回答
1回答
-
ccmouse
2020-07-28
这个要具体分析,不完全是效率的原因,而是程序逻辑导致。
这个例子里每次a[i]++后,我们立刻就会跑runtime.Gosched(),就会造成更多的goroutine的切换,所以效率会低。如果不用runtime.Gosched(),系统不可能每次自增1就去切换,所以效率会高。
其实按照这个想法,我们也可以考虑不要每次自增1就runtime.Gosched(),一样效率可以提高
00
相似问题