如何从异步迭代器获取常规迭代器?

6 iterator asynchronous python-3.x

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

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!')
Run Code Online (Sandbox Code Playgroud)

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

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

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

pyl*_*ang 0

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

给定

import time
import random
import asyncio

from unsync import unsync
Run Code Online (Sandbox Code Playgroud)

# 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
Run Code Online (Sandbox Code Playgroud)

代码

我们可以直接调用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]
Run Code Online (Sandbox Code Playgroud)

细节

以下是 Python Byte第 73 集的描述:

您只需采用任何异步函数,然后放置一个@unsync装饰器即可。...它基本上会将其包装起来并执行所有异步初始化操作...然后您可以等待结果,或者不等待结果,无论您喜欢什么。...然后,如果您将其放在常规函数上,而不是异步函数上,它将导致它在线程池执行器上的线程池线程上运行。