生成器如何进化成协程

协程的底层架构在“PEP 342—Coroutines via Enhanced
Generators”(https://www.python.org/dev/peps/pep-0342/)中定义,并在
Python 2.5(2006 年)实现了。自此之后,yield 关键字可以在表达式
中使用,而且生成器 API 中增加了 .send(value) 方法。生成器的调用
方可以使用 .send(…) 方法发送数据,发送的数据会成为生成器函数
中 yield 表达式的值。因此,生成器可以作为协程使用。协程是指一
个过程,这个过程与调用方协作,产出由调用方提供的值。

除了 .send(…) 方法,PEP 342 还添加了 .throw(…) 和 .close()
方法:前者的作用是让调用方抛出异常,在生成器中处理;后者的作用
是终止生成器。下一节和 16.5 节会说明这些方法。

协程最近的演进来自 Python 3.3(2012 年)实现的“PEP 380—Syntax for
Delegating to a Subgenerator”(https://www.python.org/dev/peps/pep-
0380/)。PEP 380 对生成器函数的句法做了两处改动,以便更好地作为
协程使用。

  • 现在,生成器可以返回一个值;以前,如果在生成器中给 return
    语句提供值,会抛出 SyntaxError 异常。

  • 新引入了 yield from 句法,使用它可以把复杂的生成器重构成小
    型的嵌套生成器,省去了之前把生成器的工作委托给子生成器所需
    的大量样板代码。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐