使用asyncio.run迭代嵌套异步转同步生成器时仅执行首次循环的问题
问题修复方案
问题原因
每次调用asyncio.run()都会创建并启动一个全新的事件循环,执行完毕后立刻关闭该循环。你的异步生成器实例async_generator绑定在第一次调用时的事件循环上,当循环被关闭后,后续调用__anext__()会直接触发StopAsyncIteration,导致生成器提前终止。
修复代码
复用同一个事件循环来执行异步生成器的每一次迭代,而不是每次都新建循环:
import asyncio async def async_generator_source(): yield 1 yield 2 yield 3 async def async_generator_wrapper(): async for item in async_generator_source(): yield f"source says: {item}" def sync_generator_wrapper(): async_generator = async_generator_wrapper() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: while True: item = loop.run_until_complete(async_generator.__anext__()) print(item) except StopAsyncIteration: print("stop async iteration received") finally: loop.close() sync_generator_wrapper()
代码说明
- 提前创建一个持久的事件循环
loop,并设置为当前线程的默认循环 - 每次调用
loop.run_until_complete(async_generator.__anext__())获取异步生成器的下一个元素,复用同一个循环以保留生成器的状态 - 在
finally块中关闭循环,避免资源泄漏
运行这段代码后,会得到预期输出:
source says: 1 source says: 2 source says: 3 stop async iteration received
内容的提问来源于stack exchange,提问作者Guibod
相关产品推荐
相关产品推荐

