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

Rai*_*ker 5 python coroutine

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

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

Was*_*mad 14

Generator使用yield来返回值.Python生成器函数也可以使用(yield)语句来使用值.此外,还有两个关于生成器对象的新方法,send()close()为使用和生成值的对象创建框架.定义这些对象的生成器函数称为协同程序.

协程使用(yield)如下语句消耗值:

value = (yield)
Run Code Online (Sandbox Code Playgroud)

使用此语法,执行将暂停此语句,直到使用参数调用对象的send方法:

coroutine.send(data)
Run Code Online (Sandbox Code Playgroud)

然后,执行恢复,将值分配给数据值.为了表示计算的结束,我们使用该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 ===")
Run Code Online (Sandbox Code Playgroud)

我们用模式初始化它,并调用__next__()开始执行:

m = match("Jabberwock")
m.__next__()
Looking for Jabberwock
Run Code Online (Sandbox Code Playgroud)

调用__next__()导致函数体被执行,因此打印出"寻找jabberwock"这一行.执行将继续,直到line = (yield)遇到该语句.然后,执行暂停,并等待将值发送到m.我们可以使用它发送值send().

  • 我喜欢你的帖子,但也许它也可以详细说明为什么/何时它们比函数或对象更好? (2认同)