【问题标题】:How to get a regular iterator from an asynchronous iterator?如何从异步迭代器中获取常规迭代器?
【发布时间】:2020-01-15 11:30:39
【问题描述】:

有一个异步迭代。需要一个常规的可迭代对象。

asyc def aiter2iter(aiter):
    l = []
    async for chunk in aiter:
        l.append(chunk)
    return l

regular_iterable = await aiter2iter(my_async_iterable)
for chunk in regular_iterable:
    print('Hooray! No async required here!')

这是要走的路还是我在重新发明轮子?

Python 是否提供了将异步迭代转换为常规迭代的方法?

我写的也是正确的吗?我没有错过什么吗?

【问题讨论】:

    标签: python-3.x asynchronous iterator


    【解决方案1】:

    你的方法没问题。在异步/同步函数之间工作时,我也会尝试unsync

    给定

    import time
    import random
    import asyncio
    
    from unsync import unsync
    

    # Sample async iterators
    class AsyncIterator:
        """Yield random numbers."""
    
        def __aiter__(self):
            return self
    
        async def __anext__(self):
            await asyncio.sleep(0.1)
            return random.randint(0, 10)
    
    
    async def anumbers(n=10):
        """Yield the first `n` random numbers."""
        i = 0
    
        async for x in AsyncIterator():
    
            if i == n:
                return
            yield x
            i +=1
    

    代码

    我们可以直接调用result(),而不是等待和重复结果:

    @unsync
    async def aiterate(aiter):
        """Return a list from an aiter object."""
        return [x async for x in aiter]
    
    
    aiterate(anumbers(5)).result()
    # [8, 2, 5, 8, 9]
    

    详情

    这是一个描述,来自 Python Byte 的episode 73

    您只需使用任何异步函数,并放置一个 @unsync 装饰器。 ...它基本上会把它包装起来并做所有异步初始化的东西......然后你可以等待结果,或者不等待结果,但是你喜欢。 ...那么如果你把它放在一个常规函数上,而不是一个异步函数上,它会导致它在线程池线程上运行,在线程池执行器上。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2014-05-20
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多