【问题标题】:Get an iterable generator from an async generator从异步生成器获取可迭代生成器
【发布时间】:2019-09-08 18:03:17
【问题描述】:

我有一个异步生成器,我正试图将它传递给 keras 模型 fit_generator,但异步生成器返回一个对象,而不是生成器。

我试过谷歌搜索,但没有找到解决方案。这似乎是一个非常具体的问题。

【问题讨论】:

  • 您是否尝试过将生成器收集到列表中并将其传递给模型?您可以为此使用异步列表理解,例如lst = [x async for x in bla()]
  • 是的,但是,我有几千万行数据,所以我试图找到一种方法来做异步生成器 -> 生成器。
  • 可以分批做吗?除非线程有魔法,否则非异步代码将永远无法处理异步生成器。
  • 查看this answer 了解线程方法,但批处理可能是更简单的选择。

标签: generator python-3.7 python-asyncio


【解决方案1】:

asyncio 的意图是将异步生成器从常规生成器中分离出来,阅读答案here

但是,如果您决定不在其他地方同时运行异步生成器并且您的唯一目的是避免 RAM 溢出,您可以将异步生成器转换为常规的 manually 迭代异步生成器并等待每个新项目:

import asyncio


async def my_gen():
    for i in range(10):
        yield i
        await asyncio.sleep(0.5)


def to_sync_generator(ait):
    loop = asyncio.get_event_loop()
    try:
        while True:
            try:
                coro = ait.__anext__()
                res = loop.run_until_complete(coro)
            except StopAsyncIteration:
                return
            else:
                yield res
    finally:
        coro = loop.shutdown_asyncgens()
        loop.run_until_complete(coro)


# Check:

if __name__ == '__main__':
    for i in to_sync_generator(my_gen()):
        print(i)

P.S.没有太多测试代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多