为什么我们需要python中的协同程序?

时间:2016-12-02 06:03:25

标签: python coroutine

我很久以前就听说过常规,但从未使用它们。据我所知,协同例程类似于生成器。

为什么我们需要Python中的协同例程?

2 个答案:

答案 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)

协同程序类似于生成器,但有一些差异。主要区别是:

  1. 生成器是数据生成者
  2. coroutines是数据消费者
  3. You may have a look here for details