首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将异步生成器转换为同步生成器

将异步生成器转换为同步生成器
EN

Stack Overflow用户
提问于 2022-03-23 01:12:20
回答 1查看 229关注 0票数 3

假设我们有一个返回生成器的原始API (它实际上是一种机制,在向用户提供简单生成器的同时,从服务器中获取页面/结果块,并允许他逐个迭代这些结果。为了简单起见:

代码语言:javascript
复制
# Original sync generator
def get_results():
     # fetch from server
     yield 1
     yield 2
     # fetch next page
     yield 3
     yield 4
     # ....

现在需要实现API的异步版本,但是我们也需要保持旧API的运行。这是事情变得复杂的地方,我们希望将异步生成器转换为同步生成器,但我找不到一种优雅的方法。到目前为止,我能做的最好的事情就是“先将所有结果提取到列表中,然后在列表上提供一个假同步生成器”。哪种方式违背了目的:

代码语言:javascript
复制
# 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

是否有更好、更优雅的方法在返回结果之前不获取所有结果?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-23 02:22:58

由于异步具有传染性,很难编写优雅的代码来将异步代码集成到旧代码中。对于上面的场景,流畅的代码更好一些,但我认为它不够优雅。

代码语言:javascript
复制
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():
    gen = get_results_async()
    while True:
        try:
            yield asyncio.run(gen.__anext__())
        except StopAsyncIteration:
            break 

你可以重用你的事件循环,而不是创建一个新的循环。

代码语言:javascript
复制
async def get_results_async():
    # await fetch from server
    yield 1
    yield 2
    # await fetch next page
    yield 3
    yield 4
    # ....

# loop that you save in somewhere.
loop = asyncio.get_event_loop()

# Backward compatible sync generator
def get_results():
    gen = get_results_async()
    while True:
        try:
            yield loop.run_until_complete(gen.__anext__())
        except StopAsyncIteration:
            break 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71580727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档