其实说是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解释器。不过原理跟上面解释的应该差不多。
本文深入探讨了绿色协程与生成器之间的上下文转换过程,详细解析了每个生成器中包含的关键信息,如original_esp、stack栈、pause_esp以及eax寄存器的作用,揭示了其在上下文转换中的具体实现方式。
1784





