有一种观点:协程就是函数调用栈。每增加一个协程,就增加一个函数调用栈。
这个是从实现的角度来解释协程,确实可以让大家清楚协程实现的原理。
通常来说,每调用一个函数都会生成一个调用栈帧,记录函数执行时需要的各种信息,函数退出时销毁栈帧,返回上次调用者的栈帧里接着执行。
而协程给开发者提供了在多个函数之间无中断跳转的能力:一个函数执行到一半,可以暂停,去执行另外一个函数,执行完毕后再回来从暂停处接着执行。
原来单个函数栈的方式是无法提供这样的能力的,函数要返回,必然导致栈帧被销毁,那自然无法接着执行该函数。
而每创建一个协程,就相当于多了一个函数调用栈,这个栈上面有自己的栈帧,协程的切换就相当于切换当前执行栈。这样如果要回到原来的函数执行的地方接着执行,把整个栈切换过去即可恢复函数的运行,达到不退出函数就可以切换函数的效果。