You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:04:55