其实说是greenlet之间跳转执行,根本应该是generator之间的跳转执行。那么它们之间跳转执行,是怎么进行上下文转换的呢?
下面为猜想啊:
每个generator都包含下面信息
original_esp 存放执行next()之前esp的,用于从generator返回时,恢复原来esp指。
stack 栈,初始化的generator为空,跳入generator执行时,会存放调用函数的环境,它的作用可以想象为与进程的栈作用一样。
pause_esp 当generator暂停执行时,存放暂停之前的esp值,这样当generator恢复执行时,将esp寄存器设为该指,即可快速恢复generator执行坏境。
eax 寄存器可用于在generator之间传递返回值。
纠正:
原本以为python协程都是用generator实现的,看了greenlet后,发现不是。greenlet是直接通过C实现的,以模块的形式加载进python解释器。不过原理跟上面解释的应该差不多。