为什么我们需要 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().

向它发送值

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

  1. 生成器是数据生产者
  2. 协程是数据消费者

You may have a look here for details