python协程.pptx
Python 协程是一种轻量级的并发机制,它允许单线程内的多个任务协作执行,而无需线程切换带来的开销。协程的核心在于 `yield` 关键字,它使得函数能够暂停执行并保存状态,之后可以从暂停的地方继续。协程在语法上与生成器相似,但它们的交互方式有所不同。 在生成器中,`yield` 通常用于产出值,而协程则可以接收和产出值。当 `yield` 后面没有表达式时,协程会产出 `None`。协程通过 `.send(datum)` 方法接收外部传递的数据,而不是像生成器那样通过 `next()` 函数。`yield` 关键字不仅可以产出数据,还可以用于流程控制,使得协程之间能够协作执行,从而实现多任务并行。 协程的状态管理是其关键特性之一。它们可以处于以下四种状态: 1. **GEN_CREATED**:等待开始执行,即协程函数被调用但尚未执行。 2. **GEN_RUNNING**:解释器正在执行协程代码。 3. **GEN_SUSPENDED**:在 `yield` 表达式处暂停,等待数据输入或被唤醒。 4. **GEN_CLOSED**:执行结束,协程不再可用。 要启动协程,首先需要调用 `next()` 函数,将协程推进到 `yield` 表达式处暂停。然后,通过 `send()` 方法传递数据,协程会恢复执行,直到遇到下一个 `yield` 或结束。 例如,计算移动平均值的协程会先产出初始值 `None`,然后通过 `send()` 接收数据并计算平均值。如果协程中出现未处理的异常,这个异常会回溯到调用 `next()` 或 `send()` 的代码。为了终止协程,可以发送特定的“哨符值”,如 `None` 或 `Ellipsis`,或者通过 `generator.throw()` 抛出异常。`generator.close()` 方法会引发 `GeneratorExit` 异常,如果协程不处理这个异常,它会终止。 `yield from` 结构是协程中另一个重要的特性,它允许一个协程委托其执行给另一个协程或可迭代对象。这样,`subgen` 的产出会被直接传递给调用 `gen` 的代码,同时 `gen` 会等待 `subgen` 完成。`yield from` 会自动处理 `StopIteration` 异常,并将返回值作为自身的产出。 Python 协程提供了高效、灵活的并发解决方案,尤其适用于 I/O 密集型任务。通过利用 `yield` 和 `yield from`,开发者可以创建复杂的并发逻辑,实现高效的任务调度和数据交换。掌握协程的使用,能极大提升 Python 应用程序的性能和可维护性。