本文展示了一个 Python 异步生成器 alternatinggenerator
,它能够交替地从两个其他异步生成器中获取值。 该代码实现了异步迭代协议 (__aiter__
和 __anext__
),允许使用 async for
循环或手动调用 anext
来迭代结果。
alternatinggenerator
类接受两个异步生成器作为输入 (gen1
和 gen2
)。__anext__
方法的核心逻辑在于它交替地从 gen1
和 gen2
中获取下一个值。当一个生成器完成迭代(抛出 StopAsyncIteration
异常)时,该生成器会被标记为已完成,__anext__
方法会递归调用自身,继续从另一个生成器中获取值,直到两个生成器都完成。
示例代码中,three()
生成器生成 3, 13, 23, 33 的序列,five()
生成器生成 5, 15, 25, ... 的序列。main()
函数创建一个 alternatinggenerator
实例,并使用 while True
循环和 anext
函数交替打印来自两个生成器的值,直到所有值都被打印。 try...except
块处理 StopAsyncIteration
异常,确保程序在生成器完成时优雅地退出。
输出结果展示了 alternatinggenerator
正确地交替从两个生成器中获取值:3, 5, 13, 15, 23, 25, 35, 45, 55, 65, 75, 85, 95. 注意,由于 sleep(0.25)
的存在,每个数字的输出之间会有短暂的延迟。 如果去掉 sleep
函数,输出速度将会更快。 这突显了异步生成器在处理耗时操作时的优势。