我很久以前就听说过常规,但从未使用它们。据我所知,协同例程类似于生成器。
为什么我们需要Python中的协同例程?
答案 0 :(得分:10)
Generator使用yield返回值。 Python生成器函数也可以使用(yield)
语句来使用值。另外,生成器对象的两个新方法send()
和close()
为使用和生成值的对象创建了一个框架。定义这些对象的生成器函数称为coroutines。
协同程序使用(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()
向其发送值。
答案 1 :(得分:1)
协同程序类似于生成器,但有一些差异。主要区别是: