这是个好问题。我欢迎大家思考后结合项目提出的问题。
有关goroutine和coroutine的区别,我们大可不必纠结。因为coroutine只是一个说法,它并没有一个业界公认的严格定义。比如同学说的,coroutine是单线程执行,但我个人认为它本身只是为了强调它可以单线程执行,并不是必须单线程执行。那么goroutine算不算coroutine,我们就认为,goroutine是coroutine概念在go语言中对应的实现,就可以了。
回到技术本身,抢占或是非抢占,单线程或是多线程,这些都是底层要关心的事。go语言在语言本身在应用层面上并不关心。本身go语言也已经从单线程非抢占,发展到现在的多线程抢占式。
所以上图右边,传统协程和goroutine,两个框图是一样的。都应该是右边那个。而且交出控制权发生在阻塞的时候,阻塞结束应该是获得控制权。
3.1 主要疑问在图中右边的红框内,Golang的协程(goroutine)在面对2个协程都处于阻塞的情况下,系统会来回不断的把当前协程的控制权交出,然后转让给另外的协程吗?
阻塞了就交出了,那两个都阻塞了就给第三个。没有第三个,操作系统就把你这个进程进入阻塞态,让其他的进程来运行。
阻塞结束是一个被动的机制,等到请求返回,操作系统会知道,然后唤醒你的进程,go运行环境又会把相应的goroutine调度来运行。在请求返回之前它们都不会占用资源,来回切换等。