Python 3中能否像常规生成器一样从异步生成器续接迭代?
异步生成器的迭代消费特性和常规生成器一致吗?
嘿,这个问题问得很精准!答案是完全可以——异步生成器和常规生成器在「返回一次性迭代器、从中断处继续执行」这个核心行为上是高度一致的,只是操作方式因为异步特性略有不同。
先回顾下常规生成器的行为
常规生成器调用后会返回一个迭代器,它只能被消费一次,每次调用next()都会从上次yield暂停的位置继续执行:
def regular_generator(): yield "第一步" yield "第二步" yield "第三步" # 获取迭代器 gen = regular_generator() print(next(gen)) # 输出:第一步 print(next(gen)) # 输出:第二步 # 迭代器耗尽后无法再获取值,必须重新调用生成器函数得到新实例
异步生成器的对应行为
异步生成器的逻辑和上面完全一致,只是它返回的是异步迭代器,消费时需要用异步的方式:
import asyncio async def async_generator(): yield "异步第一步" await asyncio.sleep(0.1) # 模拟异步IO操作 yield "异步第二步" yield "异步第三步" async def main(): # 获取异步迭代器 agen = async_generator() # 用await anext()逐次消费,从上次暂停处继续 print(await anext(agen)) # 输出:异步第一步 print(await anext(agen)) # 输出:异步第二步 # 更常用的方式是用async for自动迭代,直到耗尽 async for step in async_generator(): print(step) # 依次输出:异步第一步、异步第二步、异步第三步 asyncio.run(main())
关键特性总结
- 一次性消费:和常规迭代器一样,异步迭代器只能被消费一次,一旦抛出
StopAsyncIteration(迭代耗尽),就无法再从中获取新值,必须重新调用异步生成器函数得到新的异步迭代器实例。 - 断点续行:每次
yield(或者await操作完成后),异步生成器会暂停执行,下次消费时会精准从暂停的位置继续运行后续代码。 - 异步消费方式:不能用常规的
next(),必须用await anext(agen)或者async for循环来消费异步迭代器,这是因为异步生成器的执行依赖事件循环。
内容的提问来源于stack exchange,提问作者zonked.zonda
相关产品推荐
相关产品推荐

