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



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

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 是否提供了任何将异步可迭代对象转换为常规可迭代对象的方法?

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

你的方式很好。 在异步/同步功能之间工作时,我也会尝试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第73集的描述:

你只需使用任何异步函数,并放置一个@unsync装饰器。它基本上会把它包起来并做所有异步初始化的事情...... 然后你可以等待结果,也可以不等待结果,随心所欲。...然后,如果您将其放在常规函数而不是异步函数上,则会导致它在线程池线程上运行,在线程池执行器上。

最新更新