Python解释器如何实现协程

时间:2019-02-20 04:39:29

标签: python yield coroutine

当前,我正在尝试了解Python如何实现yield和生成器。在文档上说

  

所谓暂停,是指保留所有局部状态,包括局部变量的当前绑定,指令指针,内部评估堆栈以及任何异常处理的状态。当通过调用生成器的方法之一恢复执行时,该函数可以像yield表达式只是另一个外部调用一样继续执行。

这对我来说似乎非常违反直觉,因为我知道的所有函数调用方案都是基于堆栈的,例如C调用约定。我真的很好奇Python如何在幕后存储函数的所有状态,以及执行流如何回到yield之后的位置。

最后一个问题是,是否有任何算法可以从任意生成器函数派生生成器迭代器的实现。例如,假设我们有一个生成器函数:

def generator_f():
    for i in range(10):
        yield i
    for i in range(10):
        yield i

我们是否可以系统地实现与generator_f()返回的生成器迭代器在功能上等效的迭代器?从功能上讲,我指的是行为和(记忆)效率。

1 个答案:

答案 0 :(得分:0)

您可以在cpython/Lib/asyncio/coroutines.py中查看Cpython如何实现协程。要了解生成器的实现方式,请参见cpython/Objects/genobject.c。具体来说,在功能yield fromgen_getyieldfrom()中可以找到_PyGen_yf()后面的逻辑。

关于等效迭代器的问题:

iter([*range(10), *range(10)])