概念区别
- 生成器:是一种特殊的迭代器,通过
yield
关键字来暂停函数执行并返回一个值,函数的状态会被保留,下次调用 next()
时从暂停处继续执行。它主要用于按需生成数据,而不是一次性生成并占用大量内存。
- 协程:是一种更高级的控制流形式,允许函数在执行过程中暂停和恢复,并且可以在多个协程之间切换执行。协程可以主动让出执行权,实现更细粒度的异步编程。
使用场景区别
- 生成器:
- 数据生成:当需要生成大量数据但不想一次性占用过多内存时,如生成无限序列。例如,生成斐波那契数列:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
- **迭代器模式**:实现自定义迭代器,便于在 `for` 循环等场景中使用。
- 协程:
- 异步I/O操作:在处理大量I/O操作(如网络请求、文件读写)时,协程可以在I/O等待时让出执行权,提高程序的并发性和效率。例如,使用
asyncio
库进行异步网络请求:
import asyncio
async def fetch_data():
await asyncio.sleep(1)
return "Data fetched"
- **微线程编程**:在单线程内实现类似多线程的效果,避免多线程的资源竞争和上下文切换开销。
实现机制区别
- 生成器:通过
yield
关键字暂停和恢复函数执行。调用生成器函数会返回一个生成器对象,使用 next()
函数或在 for
循环中迭代来推进生成器。生成器内部维护一个状态机,记录函数暂停的位置和局部变量的值。
- 协程:在Python 3.5+ 中,通过
async
和 await
关键字来定义和使用协程。async
定义一个协程函数,await
用于暂停协程执行并等待一个可等待对象(如另一个协程)完成。协程的调度由事件循环(如 asyncio
的事件循环)管理,事件循环负责在不同协程之间切换执行。