标准答案

  1. yield 让普通生成器保存执行状态,适合大文件、分页和流水线处理。
  2. async yield 允许在产生下一项前 await I/O,适合异步流。
  3. 生成器中的文件、连接和临时资源要在 close、异常和取消时释放。
  4. 生成器只改变数据产生方式,不自动限制消费者处理速度。

题目解析

生成器通过 yield 保存执行状态,适合大文件、分页和逐项流水线;异步生成器可以在下一项产生前 await I/O。它们减少生产端峰值内存,但不会自动限制消费者速度。

排序、全量聚合和完整 JSON 解析仍可能需要持有全部数据,不能因为使用 yield 就忽略算法和内存边界。生产与消费之间要有背压或有界队列。

生成器持有的文件、连接和临时资源必须在正常结束、异常、close 和取消时释放,异步生成器还要处理 GeneratorExit/CancelledError。

常见误区

  • 误区:生成器内部一次性构建完整列表。改正:逐步读取和处理,避免在生成器内部重新制造全量内存。
  • 误区:异步生成器没有处理关闭和取消。改正:在 finally 中释放资源,并让取消继续传播。
  • 误区:把 yield 数据无限缓存。改正:限制消费者队列和缓存,实施背压。

作者信息