我很久以前就听说过协程,但从未使用过。据我所知,协程与生成器类似。
为什么我们需要在Python中使用协程?
我很久以前就听说过协程,但从未使用过。据我所知,协程与生成器类似。
为什么我们需要在Python中使用协程?
生成器使用yield返回值。Python生成器函数也可以通过(yield)
语句消耗值。此外,生成器对象上的两个新方法send()
和close()
为消费和生产值的对象创建了一个框架。定义这些对象的生成器函数称为协程。
协程使用(yield)
语句来消耗值,如下所示:
value = (yield)
使用这个语法,执行会在此语句处暂停,直到调用对象的send方法并传入一个参数:
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__()
会导致函数体被执行,因此"正在寻找jabberwock"这行代码将被输出。执行将继续直到遇到语句line = (yield)
。然后,执行暂停,并等待一个值被发送到m。我们可以使用send()
向其发送值。