为什么我们需要 python 中的协程?
Why do we need coroutines in python?
很久以前就听说过协程,但从未使用过。据我所知,协程类似于生成器。
为什么我们需要 Python 中的协程?
Generator uses yield to return values. Python generator functions can also consume values using a (yield)
statement. In addition two new methods on generator objects, send()
and close()
, create a framework for objects that consume and produce values. Generator functions that define these objects are called coroutines.
协程使用 (yield)
语句消耗值,如下所示:
value = (yield)
使用此语法,执行将在此语句处暂停,直到使用参数调用对象的发送方法:
coroutine.send(data)
然后,执行恢复,将值分配给数据的值。为了表示计算结束,我们使用 close()
方法关闭协程。这会在协程内部引发 GeneratorExit 异常,我们可以使用 try/except 子句捕获该异常。
下面的示例说明了这些概念。它是一个协程,打印与提供的模式匹配的字符串。
def match(pattern):
print('Looking for ' + pattern)
try:
while True:
s = (yield)
if pattern in s:
print(s)
except GeneratorExit:
print("=== Done ===")
我们用一个模式初始化它,然后调用__next__()
开始执行:
m = match("Jabberwock")
m.__next__()
Looking for Jabberwock
对 __next__()
的调用导致函数主体被执行,因此行 "Looking for jabberwock" 被打印出来。继续执行,直到遇到语句 line = (yield)
。然后,执行暂停,并等待一个值被发送到 m。我们可以使用 send()
.
向它发送值
协程类似于生成器,但有一些不同。主要区别是:
- 生成器是数据生产者
- 协程是数据消费者
很久以前就听说过协程,但从未使用过。据我所知,协程类似于生成器。
为什么我们需要 Python 中的协程?
Generator uses yield to return values. Python generator functions can also consume values using a (yield)
statement. In addition two new methods on generator objects, send()
and close()
, create a framework for objects that consume and produce values. Generator functions that define these objects are called coroutines.
协程使用 (yield)
语句消耗值,如下所示:
value = (yield)
使用此语法,执行将在此语句处暂停,直到使用参数调用对象的发送方法:
coroutine.send(data)
然后,执行恢复,将值分配给数据的值。为了表示计算结束,我们使用 close()
方法关闭协程。这会在协程内部引发 GeneratorExit 异常,我们可以使用 try/except 子句捕获该异常。
下面的示例说明了这些概念。它是一个协程,打印与提供的模式匹配的字符串。
def match(pattern):
print('Looking for ' + pattern)
try:
while True:
s = (yield)
if pattern in s:
print(s)
except GeneratorExit:
print("=== Done ===")
我们用一个模式初始化它,然后调用__next__()
开始执行:
m = match("Jabberwock")
m.__next__()
Looking for Jabberwock
对 __next__()
的调用导致函数主体被执行,因此行 "Looking for jabberwock" 被打印出来。继续执行,直到遇到语句 line = (yield)
。然后,执行暂停,并等待一个值被发送到 m。我们可以使用 send()
.
协程类似于生成器,但有一些不同。主要区别是:
- 生成器是数据生产者
- 协程是数据消费者