协程(Coroutine)和生成器(Generator)都是 Python 中用于异步编程的重要概念,但它们有一些关键的区别。
生成器(Generator):
用途: 生成器主要用于惰性计算,即按需生成值,而不是一次性生成所有值。生成器函数使用
yield
语句来产生一个值,并在下一次调用时从上一次停止的地方继续执行。状态: 生成器函数会保存其局部状态,包括局部变量的值和指令指针位置。每次调用生成器的
next()
方法,生成器都会从上一次停止的地方继续执行,直到遇到新的yield
语句或函数结束。迭代: 生成器是可迭代的,可以使用
for
循环进行迭代,也可以通过next()
方法手动迭代。示例:
def simple_generator(): yield 1 yield 2 yield 3 gen = simple_generator() print(next(gen)) # 输出 1 print(next(gen)) # 输出 2
协程(Coroutine):
用途: 协程是一种更通用的概念,用于异步编程。它允许在执行中暂停和恢复,并且可以有多个入口点(可以从外部发送值进入协程,而生成器只能通过
yield
接收值)。协程通常用于处理异步 I/O 操作。语法: 协程使用
async def
定义,并在其中使用await
表达式来暂停协程的执行,等待异步操作完成。协程还可以使用async with
和async for
等语法。状态: 协程函数保存其状态,但相比生成器,它们更加灵活,可以通过
asyncio
模块的事件循环在不同的任务之间切换执行。示例:
import asyncio async def simple_coroutine(): print("Start coroutine") await asyncio.sleep(2) # 模拟异步操作,这里暂停 2 秒 print("End coroutine") asyncio.run(simple_coroutine())
总的来说,生成器主要用于生成值的惰性计算,而协程是一种更通用、支持异步编程的概念。在异步编程中,协程是处理非阻塞操作的重要工具。