关于是否主动交出控制权

来源: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(),一样效率可以提高

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程