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

如何实现协程与主环境的数据传输?异步生成器代码修正

问题:异步生成器与主环境数据传输异常

你的代码尝试实现异步生成器与主环境的双向数据传输,但实际输出未达预期:

原代码

import asyncio


async def pipeline():
    await asyncio.sleep(0)
    for i in range(2):
        yield i
        n = yield
        print(f"{n=}")
        await asyncio.sleep(0)

async def main():
    pl = pipeline()
    async for i in pl:
        print(f"{i=}")
        await asyncio.sleep(0)
        await pl.asend(-i)

asyncio.run(main())

预期输出

i=0
n=0
i=1
n=-1

实际输出

i=0
n=None
i=1
n=None

问题原因

核心问题在于async for的自动迭代逻辑:
async for会在每次循环时自动调用生成器的anext()方法(等价于asend(None))来推进迭代。你在循环内部手动调用asend(-i)后,下一次async for的anext()会将None传入生成器的n = yield语句,导致n始终为None,覆盖了你手动发送的值。


修改方案

放弃async for,手动控制生成器的执行流程,精准控制数据传递的时机:

修改后的代码

import asyncio


async def pipeline():
    await asyncio.sleep(0)
    for i in range(2):
        yield i
        n = yield
        print(f"{n=}")
        await asyncio.sleep(0)

async def main():
    pl = pipeline()
    while True:
        try:
            # 获取生成器输出的值
            i = await pl.anext()
            print(f"{i=}")
            # 向生成器发送响应数据,同时推进到下一个yield节点
            await pl.asend(-i)
        except StopAsyncIteration:
            # 生成器迭代结束时退出循环
            break

asyncio.run(main())

执行结果

i=0
n=0
i=1
n=-1

内容的提问来源于stack exchange,提问作者WhiteApfel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:33:15