3.4.2. 协程对象

协程对象 属于 awaitable 对象。 协程的执行可通过调用 __await__() 并迭代其结果来控制。 当协程结束执行并返回时,迭代器会引发 StopIteration,该异常的 value 属性将存放返回值。 如果协程引发了异常,它会被迭代器所传播。 协程不应直接引发未处理的 StopIteration 异常。

协程也具有下面列出的方法,它们类似于生成器的对应方法 (参见 生成器-迭代器的方法)。 但是,与生成器不同,协程并不直接支持迭代。

在 3.5.2 版更改: 等待一个协程超过一次将引发 RuntimeError

coroutine.send(value)

开始或恢复协程的执行。 如果 valueNone,则这相当于前往 __await__() 所返回迭代器的下一项。 如果 value 不为 None,此方法将委托给导致协程挂起的迭代器的 send() 方法。 其结果(返回值,StopIteration 或是其他异常)将与上述对 __await__() 返回值进行迭代的结果相同。

coroutine.throw(type[, value[, traceback]])

在协程内引发指定的异常。 此方法将委托给导致协程挂起的迭代器的 throw() 方法,如果存在该方法。 否则的话,异常会在挂起点被引发。 其结果(返回值,StopIteration 或是其他异常)将与上述对 __await__() 返回值进行迭代的结果相同。 如果异常未在协程内被捕获,则将回传给调用者。

coroutine.close()

此方法会使得协程清理自身并退出。 如果协程被挂起,此方法会先委托给导致协程挂起的迭代器的 close() 方法,如果存在该方法。 然后它会在挂起点引发 GeneratorExit,使得协程立即清理自身。 最后,协程会被标记为已结束执行,即使它根本未被启动。

当协程对象将要被销毁时,会使用以上处理过程来自动关闭。