想象一下,我们有一个返回生成器的原始API(实际上它是一种从服务器获取页面/结果块的机制,同时提供一个简单的生成器给用户,并让他逐个迭代这些结果。为了简单起见:
# Original sync generator
def get_results():
# fetch from server
yield 1
yield 2
# fetch next page
yield 3
yield 4
# ....
现在有一个需要实现API的asyncio版本,但我们仍需要保持旧API的操作性。这就是事情变得复杂的地方,我们想要将async generator转换为sync one,但我找不到一种优雅的方法来实现这个目标。迄今为止,我能做到的最好的方法是“首先将所有结果获取到列表中,然后在该列表上提供一个虚假的sync generator”。但这有点违背初衷:
# Async generator
async def get_results_async():
# await fetch from server
yield 1
yield 2
# await fetch next page
yield 3
yield 4
# ....
# Backward compatible sync generator
def get_results():
async def gather_all_results():
res = []
async for i in get_results_async():
res.append(i)
return res
res = asyncio.run(gather_all_results())
for i in res:
yield i
有没有更好、更优雅的方法,在不获取所有结果的情况下返回它们?
谢谢