如何实现协程与主环境的数据传输?异步生成器代码修正
问题:异步生成器与主环境数据传输异常
你的代码尝试实现异步生成器与主环境的双向数据传输,但实际输出未达预期:
原代码
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
相关产品推荐
相关产品推荐

